当我从数据库中检索1000多个java对象时,它会很快完成。最终我List<Object>
匹配了我的查询。
问题是将这些对象绘制到Jtree
。
例如,我有一个给定节点的parentID。当双击此节点(DefaultMutableTreeNode
)(TreeMouseListener.class
)时,它将显示此节点的直接子节点,而不是所有后代(尽管可能在以后需要,但现在不需要)。
问题是这个jtree绘制操作需要很长时间才能完成为所选父节点添加1000多个子DefaultMutableTreeNodes
。
ex)1000 new DefaultMutableTreeNode(Person person);
如何加快这个绘图过程?
我没有使用任何自定义单元格渲染器,也没有为每个节点显示除小部分文本之外的任何内容。
答案 0 :(得分:5)
你需要计算减速的时间,但我怀疑它只是创建DefaultMutableTreeNodes,它应该比从数据库加载Person对象更快。它不太可能是绘画(除非你的Person#toString()非常慢),因为屏幕上不会有一千个节点。
我的猜测是你要逐个添加节点,导致一千个更改事件,而不是一次添加所有子节点。您应该直接将1000个子节点添加到父节点,然后在父节点上调用DefaultTreeModel#nodeStructureChanged(node)。
如果仍然很慢,那就是SSCCE的时候了。例如,按下系统上的按钮显示没有任何延迟:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class TestJTree {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
final DefaultTreeModel model = new DefaultTreeModel(root);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new JScrollPane(new JTree(model)));
frame.getContentPane().add(new JButton(
new AbstractAction("Add thousand children") {
@Override
public void actionPerformed(ActionEvent e) {
int offset = root.getChildCount() + 1;
for (int i = 0; i < 1000; i++) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(
"Person " + (i + offset));
// adding child with event (but isn't much slower really)
// model.insertNodeInto(child, root, root.getChildCount());
root.add(child);
}
model.nodeStructureChanged(root);
}
}), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
答案 1 :(得分:2)
您可能正在创建1000多个DefaultMutableTreeNodes来放入您的List。问题是快速创建许多对象,并将对象转换为DefaultMutableTreeNode。如果您不创建所有这些对象,则可以提高性能。我建议只编写自己的TreeModel实现,它直接与您的对象模型一起工作,这样您就不必再重新创建那么多对象了。这应该会大大提高你的速度。我之前在JTree中放了10,000个对象(我做了但它可能不是那个好主意),但我必须编写自己的TreeModel,所以我不必重新创建这些对象。
但是,与所有性能问题一样,您应首先对其进行分析,以确定您在哪里花时间并解决该问题。如果事实证明这是问题,那么你可以做到这一点。您不需要尝试创建自己的图形绘制例程,因为这比编写您自己的TreeModel要多得多。
另一个选择是根据需要按需获取树。因此,当用户展开每个节点从服务器获取其子节点时,获取根。用户无法一次查看所有1000多个节点,因此这将大大减少您通过网络传输的数量,并减少在服务器上花费的时间。
答案 2 :(得分:-3)
使用JPanel为图形编写自己的JTree:P。
或者您可以创建一个扩展JTree的类并覆盖paint(Graphics g)
方法