JTree aufklappen

Gast #1702576
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
}
Gast
@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
Persönliche Seite
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.