gpt4 book ai didi

java - 如何动态构建jtree

转载 作者:行者123 更新时间:2023-11-29 03:36:34 33 4
gpt4 key购买 nike

问题的SSCCE如下。我正在动态填充 JTree,但没有任何反应。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class DynamicTreeDemo extends JFrame
implements ActionListener {
private int newNodeSuffix = 1;
private static String ADD_COMMAND = "add";
private static String REMOVE_COMMAND = "remove";
private static String CLEAR_COMMAND = "clear";

private JTree jtrMainMenu;
DefaultMutableTreeNode rootNode = null;
DefaultTreeModel treeModel;
public DynamicTreeDemo() {
super(new BorderLayout());

//Create the components.
jtrMainMenu = new JTree();
populateTree();

JButton addButton = new JButton("Add");
addButton.setActionCommand(ADD_COMMAND);
addButton.addActionListener(this);

JButton removeButton = new JButton("Remove");
removeButton.setActionCommand(REMOVE_COMMAND);
removeButton.addActionListener(this);

JButton clearButton = new JButton("Clear");
clearButton.setActionCommand(CLEAR_COMMAND);
clearButton.addActionListener(this);

//Lay everything out.
jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);

JPanel panel = new JPanel(new GridLayout(0,3));
panel.add(addButton);
panel.add(removeButton);
panel.add(clearButton);
add(panel, BorderLayout.SOUTH);
}


public void populateTree() {
Vector<Vector<String>> data =GetDataFromDB();
java.util.List<String> list =GetListFromDB();
int i=0;;
int size=list.size();
treeModel=(DefaultTreeModel)jtrMainMenu.getModel();

((DefaultMutableTreeNode) (treeModel.getRoot())).removeAllChildren();
treeModel.reload();
rootNode = new DefaultMutableTreeNode("JewelleryERPApplication");
treeModel=new DefaultTreeModel(rootNode);


DefaultMutableTreeNode p1=null, p2=null,p3=null,p4=null,p5=null;


while(i<size){

if(list.get(i).length()==2){
p1 = addObject(null, data.get(i).elementAt(1),true);

}else
if(list.get(i).length()==4){
p2 = addObject(p1, data.get(i).elementAt(1),true);

}else if
(list.get(i).length()==6){
p3 = addObject(p2, data.get(i).elementAt(1),true);

}
else if
(list.get(i).length()==8){
p4 = addObject(p3, data.get(i).elementAt(1),true);

}
else if
(list.get(i).length()==10){
p5 = addObject(p4, data.get(i).elementAt(1),true);

}
i++;
}

jtrMainMenu.setModel(treeModel);
((DefaultMutableTreeNode) (treeModel.getRoot())).getChildCount();
jtrMainMenu.revalidate();
jtrMainMenu.repaint();
}


public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child,
boolean shouldBeVisible) {


DefaultMutableTreeNode childNode =
new DefaultMutableTreeNode(child);



if (parent == null) {
parent = rootNode;
}

//It is key to invoke this on the TreeModel, and NOT DefaultMutableTreeNode
treeModel.insertNodeInto(childNode, parent,
parent.getChildCount());

jtrMainMenu.setModel(treeModel);

//Make sure the user can see the lovely new node.
if (shouldBeVisible) {
jtrMainMenu.scrollPathToVisible(new TreePath(childNode.getPath()));
}

return childNode;
}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("DynamicTreeDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
DynamicTreeDemo newContentPane = new DynamicTreeDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}

最佳答案

你的代码有很多问题,但是......你遇到的主要问题(我认为)是当你重新加载模型时,默认情况下根节点是折叠的。

如果隐藏根节点和/或隐藏它的句柄,它将看起来好像没有加载任何内容。

取消隐藏这些元素以进行测试。

您还可以在模型重新加载后展开根节点...

enter image description here

<强>!!警告 !! 不要在你的根目录下运行它!!它将扫描所有子目录,这可能需要比您实际愿意等待更多的时间 :P

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class FileTree {

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

public FileTree() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private DefaultTreeModel model;
private JTree tree;

public TestPane() {
setLayout(new BorderLayout());

tree = new JTree();
File rootFile = new File(".");
DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootFile);
model = new DefaultTreeModel(root);

tree.setModel(model);
tree.setRootVisible(true);
tree.setShowsRootHandles(true);

add(new JScrollPane(tree));

JButton load = new JButton("Load");
add(load, BorderLayout.SOUTH);

load.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
root.removeAllChildren();
model.reload();
File rootFile = (File) root.getUserObject();

addFiles(rootFile, model, root);

tree.expandPath(new TreePath(root));

}
});

}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

protected void addFiles(File rootFile, DefaultTreeModel model, DefaultMutableTreeNode root) {

for (File file : rootFile.listFiles()) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
model.insertNodeInto(child, root, root.getChildCount());
if (file.isDirectory()) {
addFiles(file, model, child);
}
}

}
}
}

代码审查

您应该避免直接从 JFrame 扩展。从你的例子来看,你不是,而是黑进了它,但无论如何都是不可取的......

这...

jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);

这是不可取的。 JTree 应该添加到 JScrollPane

这...

private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("DynamicTreeDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
BadTree newContentPane = new BadTree();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

也不会起作用(根据您的示例),因为从 Window 扩展的任何内容都不能添加到任何其他扩展 Window

除非您的基础组件是从 JComponent 扩展的,否则其他组件必须是不透明的(JLabel 是一个明显的异常(exception)),因此设置 newContentPane不透明可能是一个静音点。

关于java - 如何动态构建jtree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215578/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com