2009-08-14 11 views
2

ist ein Follow-up zu diesen früheren Fragen:Java Swing: Wie stopCellEditing() vor TreeListeners aufrufen: valueChanged? Diese

Wenn ich die terminateEditOnFocusLost Eigenschaft, wie unten, meine CellEditor richtig stoppt die Bearbeitung, wenn die Tabelle den Fokus verliert :

jtable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

Es funktioniert auch mit meinen JButtons. Die stopCellEditing() Methode wird für meinen TableCellEditor aufgerufen, bevor die Schaltfläche drücken Aktion verarbeitet wird. Aber wenn ich es mit einem JTree verwende und die Baumauswahl sich ändert, heißt die TreeSelectionListener.valueChanged Methode vorstopCellEditing().

Weiß jemand, ob es eine Möglichkeit gibt, zuerst stopCellEditing() zu erzwingen, oder sollte ich gerade eine Lösung für dieses Problem finden?

Antwort

1

JTree hat keine ähnliche Client-Eigenschaft in Swing. Aber JXTree, eine abgeleitete Klasse von JTree, in SwingX tut: invokeStopEditing.

Wenn Sie nicht SwingX verwenden können, können Sie sich den Quellcode von JXTree sehen immer und sehen, wie diese StopEditing mecanism funktioniert: JXTree SwingX 1.0 API Documentation and Javadoc(go to Source tab)

Speziell, ab Zeile 974, ein Zuhörer erstellt "zu überwachen permanentFocusOwner "Eigenschaftsänderung auf der KeyboardFocusManager etc ...

0

ich bin nicht ganz sicher, ob ich Ihre Frage in Bezug auf die TreeSelectionListener verstehen und wie es zu dem aufgerufen wird Timing stopCellEditing() Verfahren bezieht. Erstellen Sie eine benutzerdefinierte TreeCellEditor? In diesem Fall wären einige weitere Informationen zur Einrichtung dieses Editors hilfreich.

Sie haben jedoch auch auf ein früheres Element verwiesen, das sich auf das Bearbeiten von Zellen auf einer JTable, den Fokusverlust auf eine externe Komponente und die Auswirkung auf die Bearbeitungszelle bezieht. Ich habe als Hinweis genommen, dass die Sie eine similiar Lösung für JTree möchten ...


Wie bereits erwähnt, JTree nicht die Handhabung der Eigenschaft nicht implementiert für "terminateEditOnFocusLost" aus dem Kasten heraus. Dies bedeutet nicht, dass Sie es selbst tun können.

Mit Blick auf den Code für JTable ist es ziemlich einfach. Es wird eine Klasse zusammengestellt, deren einzige Aufgabe es ist, zu identifizieren, ob der JTree immer noch den Fokus hat, wenn eine Fokusänderung stattfindet, und wenn nicht, ruft sie stopEditing() auf und wenn das fehlschlägt, ruft sie cancelEditing() auf. Hier ist es, für einen Baum angepasst:

Sie werden feststellen, dass Ihr Baum irgendwie zu dieser Klasse zugänglich sein muss.Es gibt ein paar Setup diese Arbeit zu machen auszuführen ruft:

tree.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 
KeyboardFocusManager fm = 
       KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
editorRemover = new CellEditorRemover(fm); 
fm.addPropertyChangeListener("permanentFocusOwner", editorRemover); 

Diese den zusätzlichen Vorteil, dass sollte Ihr JTree verhalten sich genauso, dass Ihr JTable benimmt sich, wenn Sie eine JButton drücken.