Page 1 of 1

JVxTable KeyListener

PostPosted: Mon May 26, 2014 4:38 pm
by Gerhard
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?

Re: JVxTable KeyListener

PostPosted: Mon May 26, 2014 5:15 pm
by manfrede
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.

Re: JVxTable KeyListener

PostPosted: Mon May 26, 2014 5:33 pm
by mhandsteiner
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);

Re: JVxTable KeyListener

PostPosted: Mon May 26, 2014 5:34 pm
by Gerhard
Ja genau diese Variante wollte ich vermeiden :)

Re: JVxTable KeyListener

PostPosted: Wed May 28, 2014 3:59 pm
by mhandsteiner
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.

Re: JVxTable KeyListener

PostPosted: Mon Jun 02, 2014 9:56 am
by Gerhard
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.

Re: JVxTable KeyListener

PostPosted: Mon Jun 02, 2014 2:24 pm
by mhandsteiner
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.

Re: JVxTable KeyListener

PostPosted: Mon Jun 02, 2014 2:32 pm
by mhandsteiner
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.