Witam, potrzebuje edytowalne drzewo z uzyciem Swinga, edytowalne to mam na mysli, ze jak najade na element w drzewie (u mnie to pliki i foldery) i jak nacisne f2, to moge zmienic nazwe tego pliku, folderu itp. Ogólnie to ustawilem juz atrybut "editable" na "true", ale nie mam pojecia co dalej. Mozecie pomoc? Z góry wielkie dzieki za pomoc
Musisz tam podpiąć listenera który czeka na zmiany w drzewie i odwzorowuje je na strukturę katalogów.
A jaki ma to być dokładnie listener?:P Moglibyście zarzucić jakimś kawałkiem kodu? Z góry dziekie
Mam jeszcze jeden problem, ja potrzebowałem stworzyć swoją własną klasę FileTreeModel, która implementuje TreeModel, a teraz bym potrzebował dodac listenera do tego modelu a nie wiem jak napisać metodę do dodawania listenera,mógłby mi ktoś w tym pomoc?:P
Dziedzicz z klasy DefaultTreeModel i overriduj metody które chcesz.
dzięki wielkie. a jeszcze mam ostatnie pytanie,skąd pobrać ta wartość,która edytuje, czyli jak zmieniłem nazwę na "plik2.txt", to skąd mogę pobrać ta wartość "plik2.txt" ?
Zrobiłem to trochę inaczej, bo nie mogłem dziedziczyć po klasie "DefaultTreeModel", a więc utowrzyłem swój własny edytor i dodałem go do drzewa jTree, doszedłem już do tego punktu, że jeżeli w drzewie jTree zmienię nazwę węzła, to przechwytuje zdarzenie odpowiednio, mam więc taki kod:
public class MyCellEditorListener implements CellEditorListener
{
public void editingStopped(ChangeEvent e)
{
System.out.println("stopped");
}
public void editingCanceled(ChangeEvent e) {
System.out.println("canelled");
}
}
I teraz cały czas mam problem, aby z poziomu tych funkcji, dostać się do węzła Node, którego nazwę zmieniłem, i do tej wartości na która zmieniłem nazwę, ma ktoś jakiś pomysł? Z góry bardzo dziękuję
Rozumiem że wywołanie getSource() na ChangeEvent cię przerosło?
Nie, ale getSource() jakoś mi dziwnie działa, po wywołaniu getSource() mam odstępne tylko takie podstawowe metody jak equals(),notify(), jaki obiekt tak naprawdę zwraca getSource w tym przypadku?
Wpadłem teraz na pomysł, aby zrobić z getSource() rzutowanie do poprawnego typu, ale nie do końca wiem jaki obiekt zwraca getSource()
Tzn, no getSource() zwraca obiekt, który wywołał event, ale który to jest obiekt, ten CellEditor?
Sprawdź? Wywołaj sobie na nim getClass() jakieś i się dowiesz.
Ok, dziękuję. A więc obiekt który mi zwraca "getSource()" jest klasy "DefaultTreeCellEditor". Ale dziwi mnie jedna rzecz, czemu poniższy kod powoduje u mnie błąd w trakcie działania programu:
@Override
public void editingStopped(ChangeEvent e)
{
DefaultTreeCellEditor edytor = (DefaultTreeCellEditor) e.getSource(); // powoduje błąd
}
Wiadomość w terminalu:
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - incompatible types
required: javax.swing.tree.DefaultTreeCellEditor
found: java.lang.Object
at lab2.MyCellEditorListener.editingStopped(MyCellEditorListener.java:23)
at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:141)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(DefaultCellEditor.java:368)
at javax.swing.DefaultCellEditor.stopCellEditing(DefaultCellEditor.java:233)
at javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(DefaultCellEditor.java:385)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
at javax.swing.JTextField.postActionEvent(JTextField.java:721)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
at java.awt.Component.processEvent(Component.java:6282)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.awt.EventQueue$3.run(EventQueue.java:686)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:702)
at java.awt.EventQueue$4.run(EventQueue.java:700)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 5 seconds)
Składniowo jest ok, bo kompilator nic nie zgłasza, dopiero runtime error :P
Rozumiem że mam zgadywać jaki jest wyjątek?...
Zresztą dla własnego dobra rzutuj na interfejs.
Spóźniłem się z edycją posta :P Dziwi mnie strasznie ta sytuacja, getSource().getClass().getName() zwraca
"javax.swing.tree.DefaultTreeCellEditor$1" ale nie mogę przy pomocy nawet wywołać metod należących do klasy DefaultTreeCellEditor
A mogłbyś pokazać jak rzutuje się na interfejs?
TreeCellEditor edytor = (TreeCellEditor) e.getSource();
Bardzo Ci dziękuję. Dobra, na razie wszystko działa, wiem już jak odwołać się do tego nowego łańcucha itp, mam do was, a pewnie głównie do Ciebie Shalom, bo ty głównie mi pomagasz w tym wątku, ostatnie pytanie. Jak z poziomu TreeCellEditor, odwołać się do tego Node, który jest edytowany, jak zawszę z góry bardzo dziękuję :P