Edytowane drzewo jTree

0

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

0

Musisz tam podpiąć listenera który czeka na zmiany w drzewie i odwzorowuje je na strukturę katalogów.

0

A jaki ma to być dokładnie listener?:P Moglibyście zarzucić jakimś kawałkiem kodu? Z góry dziekie

0

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

0

Dziedzicz z klasy DefaultTreeModel i overriduj metody które chcesz.

0

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" ?

0

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ę

0

Rozumiem że wywołanie getSource() na ChangeEvent cię przerosło?

0

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()

0

Tzn, no getSource() zwraca obiekt, który wywołał event, ale który to jest obiekt, ten CellEditor?

0

Sprawdź? Wywołaj sobie na nim getClass() jakieś i się dowiesz.

0

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

0

Rozumiem że mam zgadywać jaki jest wyjątek?...
Zresztą dla własnego dobra rzutuj na interfejs.

0

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

0

A mogłbyś pokazać jak rzutuje się na interfejs?

0
TreeCellEditor edytor = (TreeCellEditor) e.getSource(); 
0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1