2009-08-12 5 views
5

Ich versuche, eine Spalte zu einem JTable mit folgendem Verhalten (ähnlich dem Windows Explorer und ähnlicher Shells) hinzuzufügen:Erstellen eine JTable Zelle bearbeitet werden - aber * nicht durch einen Doppelklick * Klick

  • Die Zelle kann sein Einmal geklickt, um es wie gewohnt auszuwählen.
  • Die Zelle kann doppelt angeklickt werden, um eine separate Aktion auszuführen (Starten eines externen Programms).
  • Der Zellenwert (eine Zeichenfolge) kann noch bearbeitet werden, durch einmaliges Klicken (nach einer Pause) oder durch Drücken von F2 wenn die Zelle markiert ist.

Doppelklick muss nicht Trigger Bearbeitung der Zelle, aber ich möchte andere Standard-Bearbeitung in Betrieb verlassen auslöst, wenn möglich.

Ich habe das Hinzufügen versucht, eine MouseListener an den Tisch, und konsumieren alle MouseEvent s, aber das funktioniert nicht - wenn ich true von isCellEditable() kehrt dann nie meine Zuhörer empfängt alle Ereignisse klicken, aber wenn ich wieder false dann F2 nein länger funktioniert.

Kann dies nur mit Event-Listenern erreicht werden? Ich würde es vorziehen, mich nicht mit den PLAF-Funktionen zu beschäftigen, wenn ich es vermeiden kann.

+0

[Hier] (http://Stackoverflow.com/a/25919008/738017) gibt es eine neuere Antwort von [camickr] (http://stackoverflow.com/users/131872/camickr), die das Problem in 4 Zeilen Code lösen. –

Antwort

3

Sie müssen Ihren eigenen cellEditor machen und

public boolean isCellEditable(EventObject e) 

Sie ovveride zwischen Einzel- und Doppelklick mit der clickcount auf event

Wenn sein mit einem Klick und der auf einem ausgewählten unterscheiden können Zelle, die Sie zurückgeben können, true, andernfalls Rückgabe false;

abrufen Zeile und Spalte mit

int row = ((JTable) e.getSource()).rowAtPoint(e.getPoint()); 
int column = ((JTable) e.getSource()).columnAtPoint(e.getPoint()); 

F2 aktivieren Sie benutzerdefinierte hinzufügen können inputMap en actionMap Einträge

similar too 
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown"); 
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

und aus Ihrer Aktion können Sie dann feuern die cellediting selbst

table.editCellAt(row, column); 
+0

Das ist ähnlich wie bei dem Proxy. Ich überschreibe nur isCellEditable. Der Key-Stroke-Handler ist im Standard-Editor enthalten. Ich muss das nicht neu implementieren. – finnw

4

Der DefaultCellEditor verfügt über eine setClickCountToStart() -Methode, um Mausklicks zur Bearbeitung zu steuern. Der Standardwert ist 2. Das Ändern hat keine Auswirkungen auf die F2-Funktionalität.

Daher können Sie die Bearbeitung auf einen Dreifachklick einstellen.

Ich bin mir nicht sicher, wie genau zwei einzelne Klicks behandelt werden, um mit der Bearbeitung zu beginnen. Ich nehme an, Sie würden einen Timer verwenden, um den ersten Klick zu verfolgen und dann zu bearbeiten, wenn der zweite Klick innerhalb Ihres Zeitintervalls liegt.

+0

Keine Notwendigkeit für einen Timer - es muss nur zu langsam sein, um als Doppelklick zu registrieren. – finnw

1

Ich habe dieses Problem gelöst, indem die bestehenden CellEditor mit einem Proxy Einwickeln und Anrufe zu isCellEditable, Rückkehr false für alle Mausereignisse und delegieren alle anderen Anrufe an den ursprünglichen CellEditor abfängt.

Dies ist etwas komplexer als Camickr Lösung, aber funktioniert für alle Redakteure (ich habe insgesamt 4.)

+0

Ich wäre daran interessiert, die Lösung zu sehen. Außerdem verstehe ich nicht, wie Sie zwischen dem ersten Klick auf die Zelle und dem Klick unterscheiden, um die Bearbeitung zu starten. Verfolgt Ihr Code nur die letzte Zelle, die ausgewählt wurde, und wenn Sie zwei einzelne Klicks auf dieselbe Zelle erhalten, beginnen Sie mit der Bearbeitung? Wenn ja, könnte der zweite Klick Sekunden oder Minuten später sein. Ihre erste Anforderung lautete nach einer "Pause", weshalb ich einen Timer zur Steuerung des Pausenintervalls vorgeschlagen habe. – camickr

+0

@carnickr, ich habe diesen Teil noch nicht implementiert, aber ja, das klingt richtig. Es gibt kein Zeitlimit. – finnw

Verwandte Themen