Forum: PC-Programmierung JTree aufklappen


von Tobi (Gast)


Lesenswert?

Hallo,

warum wird bei folgendem Progrämmchen der JTree nicht aufgeklappt 
dargestellt ?
1
import java.util.ArrayList;
2
import javax.swing.BoxLayout;
3
import javax.swing.JFrame;
4
import javax.swing.JPanel;
5
import javax.swing.JScrollPane;
6
import javax.swing.JTree;
7
import javax.swing.SwingUtilities;
8
import javax.swing.tree.DefaultMutableTreeNode;
9
import javax.swing.tree.DefaultTreeModel;
10
import javax.swing.tree.MutableTreeNode;
11
 
12
public class TreeTest {
13
  JFrame frame;
14
  JTree tree;
15
  DefaultTreeModel model;
16
  MutableTreeNode root;
17
 
18
  public void show() {
19
    frame = new JFrame("Tree Test");
20
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
21
    JPanel panel = new JPanel();
22
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
23
24
25
    tree = new JTree();
26
    panel.add(new JScrollPane(tree));
27
    DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
28
    tree = new JTree(model);
29
  
30
    ArrayList<DefaultMutableTreeNode> node_list = new ArrayList<DefaultMutableTreeNode>(50);
31
    node_list.add(new DefaultMutableTreeNode("a1"));
32
    node_list.add(new DefaultMutableTreeNode("a2"));
33
    node_list.add(new DefaultMutableTreeNode("a3"));
34
    node_list.get(0).add(node_list.get(1));        // a2 an a1 hängen
35
    node_list.get(1).add(node_list.get(2));        // a3 an a2 hängen
36
    model.setRoot(node_list.get(0));
37
              
38
    tree.expandRow(1);
39
    tree.expandRow(2);
40
    
41
42
    frame.setContentPane(panel);
43
    frame.setSize(400,400);
44
    SwingUtilities.invokeLater(new Runnable() {
45
 
46
      public void run() {
47
        frame.setVisible(true);
48
        
49
      }
50
      
51
    });
52
  }
53
  
54
  public static void main(String[] a) {
55
    TreeTest t = new TreeTest();
56
    t.show();
57
  }
58
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Benutze lieber die Methode: scrollPathToVisible()
Auch solltest du Nodes besser mit insertNodeInto ins Model einfügen 
damit die passenden Event automatisch generiert werden.

von Tobi (Gast)


Lesenswert?

@Läubi,

scrollPathToVisible() bringt keine Veränderung und bei insertNodeInto() 
kapiere ich einfach nicht wie man in dem Beispiel "a3" an "a2" hängt.

Gruss,
Tobi

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Sollte eine aufgeklappten und einen geschlossenen Tree ergeben:
1
public class JTreeTest {
2
    public static void main(String[] args) {
3
        JFrame frame = new JFrame("Tree Test");
4
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
5
        MutableTreeNode root = new DefaultMutableTreeNode("Root is gut");
6
        DefaultTreeModel model = new DefaultTreeModel(root);
7
        MutableTreeNode newChild = new DefaultMutableTreeNode("I'm what I'm");
8
        model.insertNodeInto(newChild, root, 0);
9
        DefaultMutableTreeNode otherChild = new DefaultMutableTreeNode(
10
                "A Childs Child");
11
        model.insertNodeInto(otherChild, newChild, 0);
12
        JTree tree = new JTree(model);
13
        frame.add(new JScrollPane(tree));
14
        frame.add(new JScrollPane(new JTree(model)), BorderLayout.EAST);
15
        frame.setSize(400, 400);
16
        frame.setLocationRelativeTo(null);
17
        frame.setVisible(true);
18
        tree.scrollPathToVisible(new TreePath(otherChild.getPath()));
19
    }
20
}

Nur so nebenbei:
* Ein Frame hat schon ein Contentpane welches ein Boxlayout hat
* mußt du setVisible nicht im SwingThread aufrufen wenn es dein letzte 
Aktion des Mainthreads ist
* würde ich wenn die ganze show() Methode lieber im EventThread starten, 
oder eine Swingworker nutzen wenn das aufbauen des Trees sehr 
Zeitintensiv ist.
* Bevor du castest solltest du mit instanceof prüfen ob der Typ 
stimmt! Verhindert auch gleichzeitig den Zugriff auf ein null Objekt.

Um in einem Bestehenden Tree alles aufzuklappen (wieso eigentlich?) 
hilft dir vieleicht auch das weiter:
http://www.java2s.com/Code/Java/Swing-JFC/ExpandingorCollapsingAllNodesinaJTreeComponent.htm

von Tobi (Gast)


Lesenswert?

@Läubi,

vielen Dank, das hat mich einige Schritte weiter gebracht.

Schönes Wochenende,
Tobi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.