Erstellen einer JTable Zelle bearbeitet werden - aber * nicht durch einen Doppelklick *
-
13-09-2019 - |
Frage
Ich versuche, eine Spalte zu einer JTable
mit folgendem Verhalten (ähnlich dem Windows Explorer und ähnlichem Shells) hinzuzufügen:
- kann die Zelle einmal angeklickt werden, um es auszuwählen, wie üblich.
- kann die Zelle doppelgeklickt eine separate Aktion auszuführen (startet ein externes Programm).
- Der Zellenwert (String) kann noch bearbeitet werden, indem ein einzelner Klick ein zweites Mal (nach einer Pause) oder durch Drücken von F2 , wenn die Zelle markiert ist.
Ein Doppelklick muss nicht Trigger Bearbeitung der Zelle, aber ich möchte andere Standard-Bearbeitung verlassen löst eine Funktion, wenn möglich.
Ich habe versucht, eine MouseListener
auf die Tabelle um, und alle MouseEvent
s aufwendig, aber das funktioniert nicht - wenn ich true
von isCellEditable()
dann wieder meine Zuhörer erhält nie Click-Ereignisse, aber wenn ich wieder false
dann F2 funktioniert nicht mehr.
Kann diese Hörer mit nur Ereignisse erreicht? Ich würde es vorziehen, nicht mit den PLAF Funktionen zu verwirren, wenn ich es vermeiden kann.
Lösung
Sie müssen Ihre eigenen cellEditor und ovveride
machenpublic boolean isCellEditable( EventObject e )
Sie können mit dem auf clickcount event zwischen Einfach- und Doppelklick unterscheiden
Wenn ihr ein einzelnes Klicken und seine auf einer ausgewählten Zelle können Sie return true sonst false zurück;
abrufen Zeile und Spalte mit
int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());
F2 zu ermöglichen, können Sie fügen benutzerdefinierte inputMap en actionMap Einträge
similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction());
und von Ihrer Aktion können Sie dann die cellediting selbst feuern
table.editCellAt(row, column );
Andere Tipps
Die DefaultCellEditor hat eine setClickCountToStart () Methode Mausklicks für die Bearbeitung zu steuern. Die Standardeinstellung ist 2. Ändern dies keine Auswirkung auf F2-Funktionalität hat.
So können Sie mit der Bearbeitung einstellen ein dreifacher Klick sein.
genau nicht sicher, wie zwei einzelne Klicks zu behandeln Bearbeitung zu starten, aber ich denke, Sie einen Timer verwenden würde Spur des ersten Klick zu halten und führen Sie dann die Bearbeitung, wenn der zweite Klick innerhalb Sie Zeitintervall ist.
Ich habe dieses Problem gelöst, indem die bestehenden CellEditor
Umwickeln mit einem Proxy
und Anrufe zu isCellEditable
Abfangen Rückkehr false für alle Mausereignisse und delegieren alle anderen Anrufe auf die ursprüngliche CellEditor
.
ist etwas komplexer als Lösung des camickr funktioniert aber für alle Editoren (ich habe 4 in allen.)