Hinzufügen und Entfernen von Knoten aus einem JTree

Ich habe eine sehr einfache JTree. Als ich auf einem rush würde ich lieber nicht verwenden TreeModel wenn es nicht benötigt wird. Ich schrieb eine SSCCE, um den Fehler aufzudecken:

Manchmal habe ich einen Knoten hinzufügen. Andere Male, die ich Sie entfernen. Wenn ich push Add ein Knoten ist korrekt Hinzugefügt. Wenn ich push Remove es soll, entfernen Sie den Knoten, aber es funktioniert nicht. Auch, wenn ich versuche, hinzufügen von mehr als einem Knoten, der Baum bleibt einfach mit dem ersten Knoten I Hinzugefügt.

Schrieb ich eine update-Methode für die JTree, wo ich zuerst löschen Sie alle Knoten hängen von der root-Knoten, und dann schaue ich auf die Knoten und sub-Knoten muss ich schaffen.

Was mache ich hier falsch, abgesehen von nicht mit einer TreeModel zu betreiben in den Baum?

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;


public class TreeTest {
    private JFrame myFrame;
    private JTree myTree;
    private JButton addButton, removeButton;

    private int numberOfNodes;
    private DefaultMutableTreeNode rootNode;

    private ArrayList<String> graphicIDS;
    private ArrayList<String> graphicInfo;

    public static void main (String [ ] args){
        new TreeTest();
    }

    public TreeTest() {
        graphicIDS = new ArrayList<String>();
        numberOfNodes = 0;
        graphicInfo = new ArrayList<String>();
        graphicInfo.add("Info A");
        graphicInfo.add("Info B");
        graphicInfo.add("Info C");
        graphicInfo.add("Info D");

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        myFrame = new JFrame("JTree test");
        myFrame.setResizable(false);
        myFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        c.fill = GridBagConstraints.BOTH;
        c.anchor = GridBagConstraints.NORTH;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        c.insets = new Insets(5,5,5,5);

        rootNode = new DefaultMutableTreeNode("Root node");
        myTree = new JTree(rootNode);
        myTree.setPreferredSize(new Dimension(200, 500));
        panel.add(myTree, c);

        c.gridwidth = 1;
        c.gridy++;
        removeButton = new JButton("Remove");
        removeButton.setEnabled(false);
        removeButton.addActionListener(new ActionListener (){
            @Override
            public void actionPerformed(ActionEvent e) {    
                System.out.println("Removed curve "+(graphicIDS.size()));
                graphicIDS.remove(graphicIDS.size()-1);
                numberOfNodes--;
                updateMeasurementsTree();
            }
        });
        panel.add(removeButton, c);

        c.gridx++;
        addButton = new JButton("Add");
        addButton.addActionListener(new ActionListener (){
            @Override
            public void actionPerformed(ActionEvent e) {
                graphicIDS.add("Curve "+(numberOfNodes+1));
                System.out.println("Added curve "+(numberOfNodes+1));
                numberOfNodes++;
                updateMeasurementsTree();
            }
        });
        panel.add(addButton, c);

        myFrame.getContentPane().add(panel);
        myFrame.pack();
        myFrame.setVisible(true);
    }

    public void updateMeasurementsTree(){
        rootNode.removeAllChildren();

        for(int i=0; i<numberOfNodes;i++){  
            String idString = graphicIDS.get(i);
            DefaultMutableTreeNode idNode = new DefaultMutableTreeNode("Graphic "+idString);
            rootNode.add(idNode);
            int randomValue = (int) Math.floor(Math.random()*graphicInfo.size());
            String infoString = graphicInfo.get(randomValue);
            DefaultMutableTreeNode infoNode = new DefaultMutableTreeNode("Info "+infoString);
            idNode.add(infoNode);
        }
        if(numberOfNodes==0) removeButton.setEnabled(false);
        else{
            removeButton.setEnabled(true);
            expandAll();
        }
    }

    public void expandAll() {
        int row = 0;
        while (row < myTree.getRowCount()) {
          myTree.expandRow(row);
          row++;
        }
    }
}
Kommentar zu dem Problem
"Auf einen rush" werden können, Bremsen Sie ab; mit dem Modell, da @camickr andeutet, ist der richtige Ansatz. +1, btw, ein vollständiges Beispiel. Kommentarautor: trashgod
Eile oder nicht, Sie zu informieren das Modell, wenn Sie ändern die Knoten unter die Füße. Kein Weg herum. @camickr zeigt, wie Sie, geschmückt mit meinem Kommentar 🙂 Kommentarautor: kleopatra

InformationsquelleAutor der Frage Roman Rdgz | 2011-10-28

Schreibe einen Kommentar