Java JTree:不会重新显示新模型
当我启动JavaSwing应用程序时,我将一个XML文件读入DefaultTreeModel,用该模型创建一个新的JTree,将JTree添加到JScrollPane中,生活就好了。一切正常:Java JTree:不会重新显示新模型,java,swing,jtree,Java,Swing,Jtree,当我启动JavaSwing应用程序时,我将一个XML文件读入DefaultTreeModel,用该模型创建一个新的JTree,将JTree添加到JScrollPane中,生活就好了。一切正常: // Program initialization: jarFilesDB = new JarFilesDB (); jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME); jtree = new JTree(jarFilesDB.getRootNode ()); JSc
// Program initialization:
jarFilesDB = new JarFilesDB ();
jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME);
jtree = new JTree(jarFilesDB.getRootNode ());
JScrollPane scrollPane = new JScrollPane (jtree);
contentPane.add(scrollPane, BorderLayout.CENTER);
稍后,我可能想创建一个新的XML文件,并完全重建我的模型。当我这样做时,我无法让jtree重新显示新模型。要么我得到一个空白窗格,要么旧模型仍然显示:
// Completely regenerate XML file and Model
jarFilesDB.mkXmlFile (sPath); // Generate new XML file
jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME); // Generate new Model
按照安德鲁·汤普森的要求,我写了一篇尽可能简短、完整、正确的文章!或者我不会问这样的问题,比如:
package com.rgb;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTree;
import javax.swing.JScrollPane;
import javax.swing.tree.*;
public class FrmMain extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmMain frame = new FrmMain();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmMain() {
setTitle("HelloJTree3");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JButton btnNewButton = new JButton("Click Me");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
doClick ();
}
});
contentPane.add(btnNewButton, BorderLayout.NORTH);
jarFilesDB = new JarFilesDB ();
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
jtree = new JTree(jarFilesDB.getRootNode ());
JScrollPane scrollPane = new JScrollPane (jtree);
contentPane.add(scrollPane, BorderLayout.CENTER);
}
private void doClick () {
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
}
private JarFilesDB jarFilesDB;
private JTree jtree;
private boolean isAlpha = false;
}
class JarFilesDB extends DefaultTreeModel {
public JarFilesDB () {
super (null);
}
public void load (boolean isAlpha) {
if (rootNode == null)
rootNode = new DefaultMutableTreeNode("root");
else
rootNode.removeAllChildren ();
String[] values;
if (isAlpha)
values = new String[] {"A", "A1", "A2", "B", "B1", "B2"};
else
values = new String[] {"10", "11", "12", "20", "21", "22"};
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (values[0]);
DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode (values[1]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[2]);
childNode.add(leafNode);
rootNode.add(childNode);
childNode = new DefaultMutableTreeNode (values[3]);
leafNode = new DefaultMutableTreeNode (values[4]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[5]);
childNode.add(leafNode);
rootNode.add(childNode);
}
public TreeNode getRootNode () {
return rootNode;
}
private DefaultMutableTreeNode rootNode = null;
}
添加方法不触发更新。最好使用insertNodeInto。要修复此问题,请添加以下内容:
nodeStructureChanged(rootNode);
在加载方法的末尾
并使用此选项初始化树:
jtree = new JTree(jarFilesDB);
这是更新后的SSCCE,不确定rootNode的目的是什么,所以我将其放在一边:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTree;
import javax.swing.JScrollPane;
import javax.swing.tree.*;
public class FrmMain extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmMain frame = new FrmMain();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmMain() {
setTitle("HelloJTree3");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JButton btnNewButton = new JButton("Click Me");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
doClick ();
}
});
contentPane.add(btnNewButton, BorderLayout.NORTH);
jarFilesDB = new JarFilesDB ();
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
//jtree = new JTree(jarFilesDB.getRootNode ());
jtree = new JTree(jarFilesDB);
JScrollPane scrollPane = new JScrollPane (jtree);
contentPane.add(scrollPane, BorderLayout.CENTER);
}
private void doClick () {
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
}
private JarFilesDB jarFilesDB;
private JTree jtree;
private boolean isAlpha = false;
}
class JarFilesDB extends DefaultTreeModel {
public JarFilesDB () {
super (new DefaultMutableTreeNode("root"));
rootNode = (DefaultMutableTreeNode) getRoot();
}
public void load (boolean isAlpha) {
rootNode.removeAllChildren ();
String[] values;
if (isAlpha)
values = new String[] {"A", "A1", "A2", "B", "B1", "B2"};
else
values = new String[] {"10", "11", "12", "20", "21", "22"};
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (values[0]);
DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode (values[1]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[2]);
childNode.add(leafNode);
rootNode.add(childNode);
childNode = new DefaultMutableTreeNode (values[3]);
leafNode = new DefaultMutableTreeNode (values[4]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[5]);
childNode.add(leafNode);
rootNode.add(childNode);
nodeStructureChanged(rootNode);
}
public TreeNode getRootNode () {
return rootNode;
}
private DefaultMutableTreeNode rootNode = null;
}
添加方法不触发更新。最好使用insertNodeInto。要修复此问题,请添加以下内容:
nodeStructureChanged(rootNode);
在加载方法的末尾
并使用此选项初始化树:
jtree = new JTree(jarFilesDB);
这是更新后的SSCCE,不确定rootNode的目的是什么,所以我将其放在一边:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTree;
import javax.swing.JScrollPane;
import javax.swing.tree.*;
public class FrmMain extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmMain frame = new FrmMain();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmMain() {
setTitle("HelloJTree3");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JButton btnNewButton = new JButton("Click Me");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
doClick ();
}
});
contentPane.add(btnNewButton, BorderLayout.NORTH);
jarFilesDB = new JarFilesDB ();
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
//jtree = new JTree(jarFilesDB.getRootNode ());
jtree = new JTree(jarFilesDB);
JScrollPane scrollPane = new JScrollPane (jtree);
contentPane.add(scrollPane, BorderLayout.CENTER);
}
private void doClick () {
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
}
private JarFilesDB jarFilesDB;
private JTree jtree;
private boolean isAlpha = false;
}
class JarFilesDB extends DefaultTreeModel {
public JarFilesDB () {
super (new DefaultMutableTreeNode("root"));
rootNode = (DefaultMutableTreeNode) getRoot();
}
public void load (boolean isAlpha) {
rootNode.removeAllChildren ();
String[] values;
if (isAlpha)
values = new String[] {"A", "A1", "A2", "B", "B1", "B2"};
else
values = new String[] {"10", "11", "12", "20", "21", "22"};
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (values[0]);
DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode (values[1]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[2]);
childNode.add(leafNode);
rootNode.add(childNode);
childNode = new DefaultMutableTreeNode (values[3]);
leafNode = new DefaultMutableTreeNode (values[4]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[5]);
childNode.add(leafNode);
rootNode.add(childNode);
nodeStructureChanged(rootNode);
}
public TreeNode getRootNode () {
return rootNode;
}
private DefaultMutableTreeNode rootNode = null;
}
或者,您可以只使用JTree.updateUI或者,您可以只使用JTree.updateUI来更快地获得更好的帮助,发布一个;初始化树时?@Max-class jarFilesDB继承自DefaultTreeModel。我最初不需要setModel,因为我只使用模型的根节点作为jtree的构造函数。您删除的响应是正确的:我不需要removeAll或setModel。如果您有任何建议,我们将不胜感激:Thanx previous…@paulsm4,在上面的代码中,在初始化过程中,树使用提供的根节点创建自己的DefaulTreeModel。稍后,在更新过程中,您会将其提供给您的实现。只是为了确保模型正确实现,在初始化树时使用它,并确保得到正确的结果。然后用更新测试它。当然,你也可以这样做,反之亦然:@Andrew Thompson-我添加了一个SSCCE来重现这个问题。jtree只显示第一个数值模型,无论我更改了多少次。我相信问题很简单-请让我知道你的想法!为了更快地获得更好的帮助,发布一个。为什么不使用jtree.setModeljarFilesDB;初始化树时?@Max-class jarFilesDB继承自DefaultTreeModel。我最初不需要setModel,因为我只使用模型的根节点作为jtree的构造函数。您删除的响应是正确的:我不需要removeAll或setModel。如果您有任何建议,我们将不胜感激:Thanx previous…@paulsm4,在上面的代码中,在初始化过程中,树使用提供的根节点创建自己的DefaulTreeModel。稍后,在更新过程中,您会将其提供给您的实现。只是为了确保模型正确实现,在初始化树时使用它,并确保得到正确的结果。然后用更新测试它。当然,你也可以这样做,反之亦然:@Andrew Thompson-我添加了一个SSCCE来重现这个问题。jtree只显示第一个数值模型,无论我更改了多少次。我相信问题很简单-请让我知道你的想法!