Не могу добавить лист в Jtree
Я пытаюсь построить дерево, но я не могу добавить ни одного листа, только могу добавить в корень. Ниже приведен пример какой-либо помощи? Спасибо, Джанлука
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
public class ExtendePedigree extends JPanel{
private JTree tree;
private static String lineStyle = "Horizontal";
private static boolean useSystemLookAndFeel = false;
private JPanel descPanel;
private JTextField anelloText;
private JTextField varieta;
private int toReturn;
public ExtendePedigree(String soggetto){
JDialog extPedigreeJDialog = new JDialog();
//Create the nodes.
DefaultMutableTreeNode top =
new DefaultMutableTreeNode(soggetto);
createNodes(top,soggetto);
//Create a tree that allows one selection at a time.
tree = new JTree(top);
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
//Listen for when the selection changes.
//tree.addTreeSelectionListener(this);
//Create the scroll pane and add the tree to it.
JScrollPane treeView = new JScrollPane(tree);
descPanel = new JPanel();
//descPane.setEditable(false);
JLabel anello = new JLabel("Anello");
anelloText = new JTextField(20);
JLabel varietaLabel = new JLabel("Descrizione");
varieta = new JTextField(50);
descPanel.add(anello);
descPanel.add(anelloText);
descPanel.add(varietaLabel);
descPanel.add(varieta);
JScrollPane descView = new JScrollPane(descPanel);
//Add the scroll panes to a split pane.
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setTopComponent(treeView);
splitPane.setBottomComponent(descView);
Dimension minimumSize = new Dimension(1024, 768);
descView.setMinimumSize(minimumSize);
treeView.setMinimumSize(minimumSize);
splitPane.setDividerLocation(768/2);
splitPane.setPreferredSize(new Dimension(1024, 768));
if (useSystemLookAndFeel) {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
System.err.println("Couldn't use system look and feel.");
}
}
extPedigreeJDialog.add(splitPane);
extPedigreeJDialog.setSize(1024, 768);
extPedigreeJDialog.setLocationRelativeTo(null);
extPedigreeJDialog.setModal(true);
extPedigreeJDialog.setVisible(true);
}
Здесь я добавляю к дереву
private void createNodes(DefaultMutableTreeNode top, String a) {
DefaultMutableTreeNode nodo = null;
ArrayList<DefaultMutableTreeNode> toReadList = new ArrayList<DefaultMutableTreeNode>();
toReadList.add(new DefaultMutableTreeNode(a));
Boolean flag = true;
int j=0;
while(flag){
flag=false;
for(int k=0;k<(Math.pow(2, (j)));k++){
String b=toReadList.get(0).toString().substring(4);
System.out.println("j="+j+" k=" + k + " " + " b="+b);
//DefaultMutableTreeNode toTree = new DefaultMutableTreeNode();
for(int i=0;i<2;i++){ // leggo genitori soggetto
String toWrite = new String();
nodo=toReadList.get(0);
if((i&1)==0){
if (getPadre(b)!=null){
flag=true;
toWrite="1.0-" + getPadre(b);
}
else{
toWrite="1.0-"; }
}
else{
if (getMadre(b)!=null){
flag=true;
toWrite="0.1-" + getMadre(b);
}
else{
toWrite="0.1-";
}
}
DefaultMutableTreeNode toTree = new DefaultMutableTreeNode(toWrite);
System.out.println("toTree=" + toTree);
if(j==0){
top.add(toTree);
System.out.println("i="+i+"Add to top");
}
else{
System.out.println("Node="+nodo+"To add="+toTree);
nodo.add(toTree);
}
toReadList.add(new DefaultMutableTreeNode(toWrite));
}
toReadList.remove(0);
System.out.println("206 flag=" + flag + " k=" + k + " toRead size=" + toReadList.size());
for(int i=0;i<toReadList.size();i++)
System.out.println(i + " " + toReadList.get(i));
}
j=j+1;
}
}
Здесь главное и просто показать панели
private static void createAndShowGUI() {
if (useSystemLookAndFeel) {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
System.err.println("Couldn't use system look and feel.");
}
}
//Create and set up the window.
JFrame frame = new JFrame("ExtendePedigree");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add content to the window.
frame.add(new ExtendePedigree("0.0-FOI-89LR-E-14-13"));
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
Это методы только для запуска этого примера.
private Object getPadre(String b) {
toReturn++;
if(toReturn<20)
return("1.0-FOI-89LR-E-12-001");
return(null);
}
private Object getMadre(String b) {
toReturn++;
if(toReturn<20)
return("0.1-FOI-89LR-E-12-002");
return(null);
}
}
1 ответ
Решение
Чтобы создать дерево с несколькими уровнями, вам нужно добавить новых потомков к потомкам других узлов. Вы пытаетесь сделать это с помощью toReadList. Однако при добавлении узлов в этот список вы на самом деле берете не узел, добавленный в дерево, а вновь созданный узел. Вы создаете новые деревья (которые вы позже просто отбрасываете), к которым вы добавляете все новые узлы. Таким образом, они никогда не попадают в дерево с вершиной в качестве корня.
Замена
toReadList.add(new DefaultMutableTreeNode(toWrite));
от
toReadList.add(toTree);
исправляет это.