JVxTable KeyListener
8 posts
• Page 1 of 1
JVxTable KeyListener
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
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:
Da die AWTEventMulticaster die Events der Reihe nach abarbeiten wird zuerst unser anonymer Keylistener aufgerufen, welcher das Event bei einem "Treffer" einfach konsumiert.
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
Eine einfache Methode ist setInsertEnabled(false) und setDeleteEnabled(false).
Hat man eigene Buttons zum Einfügen oder Löschen, braucht man nur
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: 15
- Joined: Mon Sep 28, 2009 2:17 pm
Re: JVxTable KeyListener
Ja genau diese Variante wollte ich vermeiden
- Gerhard
- Posts: 15
- Joined: Tue Apr 22, 2014 5:14 pm
Re: JVxTable KeyListener
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.
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: 15
- Joined: Mon Sep 28, 2009 2:17 pm
Re: JVxTable KeyListener
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.
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
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.
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: 15
- Joined: Mon Sep 28, 2009 2:17 pm
Re: JVxTable KeyListener
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.
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: 15
- Joined: Mon Sep 28, 2009 2:17 pm
8 posts
• Page 1 of 1