如何解决动态更改JTree的数据模型
我有一个小的GUI应用程序,它处理鼠标单击并将它们存储在列表中:
package test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestGUI extends JFrame {
private final List<String> objects = new ArrayList<>();
private TestTree testTree;
final JPanel canvas = new JPanel() {
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.clearRect(0,canvas.getWidth(),canvas.getHeight());
g.setColor(Color.BLACK);
for (final String object : objects) {
final String[] parts = object.split("--");
g.drawoval(Integer.parseInt(parts[0]),Integer.parseInt(parts[1]),5,5);
}
}
};
public TestGUI() {
final Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(canvas,BorderLayout.CENTER);
testTree = new TestTree(objects);
cp.add(testTree,BorderLayout.EAST);
setTitle("TestGUI");
canvas.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent me) {}
@Override
public void mousepressed(MouseEvent me) {}
@Override
public void mouseExited(MouseEvent me) {}
@Override
public void mouseEntered(MouseEvent me) {}
@Override
public void mouseClicked(MouseEvent me) {
objects.add(me.getX() + "--" + me.getY());
testTree.update();
canvas.repaint();
}
});
setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,500);
setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokelater(new Runnable() {
@Override
public void run() {
new TestGUI();
}
});
}
}
我想使用画布侧面的JTree表示列表的概述。负责JTree的类如下:
package test;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class TestTree extends JPanel {
final List<String> objects;
private JTree tree;
private final DefaultMutableTreeNode root;
public TestTree(final List<String> theObjects) {
objects = theObjects;
root = new DefaultMutableTreeNode("root");
tree = new JTree(root);
add(new JScrollPane(tree));
}
private void updateTree(final List<String> objects) {
root.removeAllChildren();
final DefaultMutableTreeNode result = new DefaultMutableTreeNode(objects.size() + " objects");
for (final String object : objects) {
final DefaultMutableTreeNode objectNode = new DefaultMutableTreeNode(object);
result.add(objectNode);
}
root.add(result);
tree.updateUI();
}
public void update() {
updateTree(objects);
tree = new JTree(root);
add(new JScrollPane(tree));
}
}
那么,通过提交列表来更新JTree的正确方法是什么?因为单击几下后,我的应用程序为每个添加的元素渲染一棵单独的树,而不是随时间更新的一棵树:
任何建议将不胜感激。非常感谢!
解决方法
您的问题出在类update()
的方法TestTree
中。您一直在向JScrollPane
添加另一个TestTree
。您只需要一个JScrollPane
。
您正确地更新了JTree
的模型,这就是您要做的全部。 JTree
会在模型更改时自动进行自我更新。
此外,请勿设置JFrame
的大小。设置其组件的大小并调用方法pack()
,这将使JFrame
足够大以容纳其所有组件。
在下面的代码中,我注释掉了需要从代码中删除的行。
TestTree
类
package test;
import java.awt.Dimension;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class TestTree extends JPanel {
final List<String> objects;
private JTree tree;
private final DefaultMutableTreeNode root;
public TestTree(final List<String> theObjects) {
objects = theObjects;
root = new DefaultMutableTreeNode("root");
tree = new JTree(root);
JScrollPane scrollPane = new JScrollPane(tree);
scrollPane.setPreferredSize(new Dimension(100,490));
add(scrollPane);
}
private void updateTree() {
root.removeAllChildren();
final DefaultMutableTreeNode result = new DefaultMutableTreeNode(objects.size() + " objects");
for (String object : objects) {
final DefaultMutableTreeNode objectNode = new DefaultMutableTreeNode(object);
result.add(objectNode);
}
root.add(result);
tree.updateUI();
}
public void update() {
updateTree();
// tree = new JTree(root);
// add(new JScrollPane(tree));
}
}
TestGUI
类
package test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestGUI extends JFrame {
private final List<String> objects = new ArrayList<>();
private TestTree testTree;
final JPanel canvas = new JPanel() {
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.clearRect(0,canvas.getWidth(),canvas.getHeight());
g.setColor(Color.BLACK);
for (final String object : objects) {
final String[] parts = object.split("--");
g.drawOval(Integer.parseInt(parts[0]),Integer.parseInt(parts[1]),5,5);
}
}
};
public TestGUI() {
final Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(canvas,BorderLayout.CENTER);
testTree = new TestTree(objects);
cp.add(testTree,BorderLayout.EAST);
setTitle("TestGUI");
canvas.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent me) {}
@Override
public void mousePressed(MouseEvent me) {}
@Override
public void mouseExited(MouseEvent me) {}
@Override
public void mouseEntered(MouseEvent me) {}
@Override
public void mouseClicked(MouseEvent me) {
objects.add(me.getX() + "--" + me.getY());
testTree.update();
TestGUI.this.pack();
canvas.repaint();
}
});
canvas.setPreferredSize(new Dimension(400,490));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
// setSize(500,500);
setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestGUI();
}
});
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。