Java 如何动态构建jtree
问题的SSCCE如下所示。我正在动态填充Java 如何动态构建jtree,java,swing,dynamic,jtree,Java,Swing,Dynamic,Jtree,问题的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; impo
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();
}
});
}
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTree;
导入javax.swing.tree.DefaultMutableTreeNode;
导入javax.swing.tree.DefaultTreeModel;
导入javax.swing.tree.TreePath;
公共类DynamicReedemo扩展了JFrame
实现ActionListener{
private int newNodeSuffix=1;
私有静态字符串ADD_COMMAND=“ADD”;
私有静态字符串REMOVE_COMMAND=“REMOVE”;
私有静态字符串清除\u命令=“清除”;
私有JTree jtmainmenu;
DefaultMutableTreeNode rootNode=null;
默认树模型树模型;
公共DynamicReedemo(){
超级(新边框布局());
//创建组件。
jtmainmenu=新的JTree();
populateTree();
JButton addButton=新JButton(“添加”);
addButton.setActionCommand(ADD_命令);
addButton.addActionListener(此);
JButton removeButton=新JButton(“删除”);
removeButton.setActionCommand(REMOVE_命令);
removeButton.addActionListener(此);
JButton clearButton=新JButton(“清除”);
clearButton.setActionCommand(CLEAR_命令);
clearButton.addActionListener(这个);
//把一切都安排好。
jtrMainMenu.setPreferredSize(新尺寸(300150));
添加(jtmainmenu,BorderLayout.CENTER);
JPanel面板=新JPanel(新网格布局(0,3));
panel.add(添加按钮);
面板。添加(移除按钮);
面板。添加(clearButton);
添加(面板,边界布局。南部);
}
公共void populateTree(){
向量数据=GetDataFromDB();
java.util.List List=GetListFromDB();
int i=0;;
int size=list.size();
treeModel=(DefaultTreeModel)jtmainmenu.getModel();
((DefaultMutableTreeNode)(treeModel.getRoot()).removeAllChildren();
treeModel.reload();
rootNode=新的DefaultMutableTreeNode(“珠宝商应用”);
treeModel=新的DefaultTreeModel(rootNode);
DefaultMutableTreeNode p1=null,p2=null,p3=null,p4=null,p5=null;
虽然(i您的代码有很多问题,但是…您遇到的主要问题(我认为)是,当您重新加载模型时,根节点默认会折叠
如果根节点被隐藏和/或其句柄被隐藏,它将显示为未加载任何内容
取消隐藏这些元素以进行测试
您还可以在模型重新加载后展开根节点
!!警告!!不要在根目录上运行此命令!!它将扫描所有子目录,这可能需要比您实际愿意等待的时间更长的时间: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);
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);
}
这是不可取的。JTree
应添加到JScrollPane
这个
jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
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
是一个明显的例外),因此将newContentPane
设置为不透明可能是一个沉默点。您的代码有很多问题,但是……主要问题(我认为)实际上,当您重新加载模型时,根节点在默认情况下是折叠的
如果根节点被隐藏和/或其句柄被隐藏,它将显示为未加载任何内容
取消隐藏这些元素以进行测试
您还可以在模型重新加载后展开根节点
!!警告!!不要在根目录上运行此命令!!它将扫描所有子目录,这可能需要比您实际愿意等待的时间更长的时间: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);
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);
}
这是不可取的。JTree
应添加到JScrollPane
这个
jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
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
是一个明显的例外),因此将newContentPane
设置为不透明可能是一个静音点。我首先要看一下rootNode=newdefaultmutabletreenode(“珠宝商应用”)
在您的addObject
方法中要更快地获得更好的帮助,请发布一条。即使删除此语句,也不会发生任何事情@MadProgrammerThisjScrollPane_Tree.removeAll();
也让我担心,很可能您实际上已经在过程中删除了JViewport
。现在,我也删除了@MadProgrammerI部分。我首先要看一下rootNode=new DefaultMutableTreeNode(“珠宝商应用”)
在您的addObject
方法中要更快地获得更好的帮助,请发布一条。即使删除此语句,也不会发生任何事情@MadProgrammerThisjScrollPane_Tree.removeAll()
也让我担心,很可能你在这个过程中删除了JViewport
现在我也删除了@madprogrammerThank这一部分对我有用,谢谢@MadProgrammer你是一位伟大的摇摆大师(:-@SyedMuhammadMubashir我不会这么说,我之前也做过同样的事情,花了四年时间