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 MouseEvents 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.

War es hilfreich?

Lösung

Sie müssen Ihre eigenen cellEditor und ovveride

machen
public 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.

Diese

ist etwas komplexer als Lösung des camickr funktioniert aber für alle Editoren (ich habe 4 in allen.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top