JVxTable KeyListener

Allgemeine Fragen zur Entwicklung von und mit JVx.

JVxTable KeyListener

Postby Gerhard » Mon May 26, 2014 4:38 pm

Der Table hat automatisch einen KeyListner integriert, der bei Tastendruck auf Einfg ein insert ausführt. Gibt es eine einfache Möglichkeit dies zu deaktivieren?
Gerhard
 
Posts: 15
Joined: Tue Apr 22, 2014 5:14 pm

Re: JVxTable KeyListener

Postby manfrede » Mon May 26, 2014 5:15 pm

Keine Ahnung ob diese Lösung einfach ist, aber wir hatten das selbe Problem mit "Delete". Dementsprechend haben wir kurzerhand auch einen Workaround eingebaut.

Eine Subklasse von SwingFactory erstellen und dort das Erzeugen der Tabelle folgendermaßen geändert:

Code: Select all
  public ITable createTable() {
    SwingTable tab = new SwingTable();
    tab.setFactory(this);
    JTable jTable = tab.getResource().getJTable();
    jTable.removeKeyListener(tab.getResource());
    jTable.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent pKeyEvent) {
        if (!pKeyEvent.isConsumed()) {
          if (pKeyEvent.getKeyCode() == KeyEvent.VK_DELETE) {
            pKeyEvent.consume();
          }
        }
      }

    });
    jTable.addKeyListener(tab.getResource());
    return tab;
  }


Da die AWTEventMulticaster die Events der Reihe nach abarbeiten wird zuerst unser anonymer Keylistener aufgerufen, welcher das Event bei einem "Treffer" einfach konsumiert.
manfrede
 
Posts: 21
Joined: Tue Oct 22, 2013 11:45 am

Re: JVxTable KeyListener

Postby mhandsteiner » Mon May 26, 2014 5:33 pm

Eine einfache Methode ist setInsertEnabled(false) und setDeleteEnabled(false).

Hat man eigene Buttons zum Einfügen oder Löschen, braucht man nur
Code: Select all
rdbXXX.setInsertEnabled(true);
rdbXXX.insert(false);
rdbXXX.setInsertEnabled(false);
mhandsteiner
 
Posts: 14
Joined: Mon Sep 28, 2009 2:17 pm

Re: JVxTable KeyListener

Postby Gerhard » Mon May 26, 2014 5:34 pm

Ja genau diese Variante wollte ich vermeiden :)
Gerhard
 
Posts: 15
Joined: Tue Apr 22, 2014 5:14 pm

Re: JVxTable KeyListener

Postby mhandsteiner » Wed May 28, 2014 3:59 pm

Prinzipiell wenn man in eine Tabelle einfügen darf, ist es ja reine Komfortsache, ob man gleich auf der Tastatur einfügen kann, oder mit der Maus einen Button klicken muss.
Wenn man eine Maske hat, wo man nicht einfügen darf, sondern nur in einem Subdialog, dann ist die von mir beschriebene Lösung (setInsertEnabled(false) genau der logische Use-Case.

Mir fehlen Use-Cases, wo man einfach über Button aber nicht mit Einfügetaste einfügen können soll.
Welche gibt es hier konkret?
Dann kann ich möglicherweise eine API Erweiterung einbringen.
mhandsteiner
 
Posts: 14
Joined: Mon Sep 28, 2009 2:17 pm

Re: JVxTable KeyListener

Postby Gerhard » Mon Jun 02, 2014 9:56 am

Habe eine Detail-Tabelle, in die beim Anlegen des Masters automatisch Zeilen eingefügt werden. Detail-Zeilen dürfen vom Benutzer nur bearbeitet, aber nicht hinzugefügt oder gelöscht werden. Deshalb ist die ToolBar unnötig und wurde ausgeblendet. Leider ist jetzt der KeyListener noch aktiv und lässt sich anscheinend auch nicht so einfach deaktivieren.

Mittlerweile wurde die vorgeschlagene Lösung umgesetzt, und das DataBook setInsertEnabled(false) gesetzt.
Beim Anlegen des Masters wird nun auf true dann wieder false gesetzt. Und beim Löschen des Masters, wiederholt sich das Spiel mit dem Delete.
Finde es halt schade, das Detail-DataBook ist auf setDeleteCascade(true) gesetzt, und jetzt muss ich mich doch wieder darum kümmern, hier korrekt löschen zu können.
Gerhard
 
Posts: 15
Joined: Tue Apr 22, 2014 5:14 pm

Re: JVxTable KeyListener

Postby mhandsteiner » Mon Jun 02, 2014 2:24 pm

Für Detail Insert ist die Lösung mit setInsertEnabled sehr übersichtlich finde ich.

Für das Delete Cascade Problem gebe ich zu, dass das Verhalten nicht optimal ist.

2 Lösungsvorschläge:

1)
foreign key in Datenbank cascade definieren.
(Vorteil: Statement rollback im Falle eines Datenbank Fehlers beim Löschen.)

2)
eventBeforeDeleted am Master DataBook detail.setDeleteEnabled(true)
und mit invokeLater(this, "doDisableDelete");
mit public void doDisableDelete() { detail.setDeleteEnabled(false); }
wieder abdrehen.
mhandsteiner
 
Posts: 14
Joined: Mon Sep 28, 2009 2:17 pm

Re: JVxTable KeyListener

Postby mhandsteiner » Mon Jun 02, 2014 2:32 pm

Der Use Case "Delete cascade Verhalten bei deleteEnabled=false"
ist so anscheinend noch nicht benötigt worden. Das Verhalten kann hier sicher verbessert werden.
Eventuell sollten bei delete cascade die Details auch bei deleteEnabled false gelöscht werden.

Wir werden dazu auf jeden Fall eine API Änderung/Erweiterung im Open Source Projekt diskutieren.
mhandsteiner
 
Posts: 14
Joined: Mon Sep 28, 2009 2:17 pm


Return to Entwicklung