gpt4 book ai didi

java - JTree:加速从数据库检索的对象中绘制 1000 多个子节点?

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:14 25 4
gpt4 key购买 nike

当我从数据库中检索 1000 多个 java 对象时,它很快就完成了。我最终得到 List<Object>匹配我的查询。

问题是将这些对象绘制到 Jtree 上.

例如,我有给定节点的 parentID。当此节点 ( DefaultMutableTreeNode ) 被双击 ( TreeMouseListener.class ) 时,它将显示此节点的直接子节点,而不是所有后代(尽管如果可能,稍后可能需要但不是现在)。

问题是这个 jtree 绘制操作需要很长时间才能完成添加 1000 多个 child DefaultMutableTreeNodes对于选定的父节点。

ex) new DefaultMutableTreeNode(Person person); 的 1000 个

如何加快这个绘图过程?

我没有使用任何自定义单元格渲染器,也没有为每个节点显示除少量文本以外的任何内容。

最佳答案

您需要确定减速的位置,但我怀疑它只是创建 DefaultMutableTreeNodes,这应该比从数据库加载 Person 对象更快。这不太可能是绘画(除非您的 Person#toString() 非常慢),因为屏幕上不会有上千个节点。

我的猜测是您正在一个接一个地添加节点,导致一千个更改事件,而不是一次添加所有子节点。您应该直接将千个子节点添加到父节点,然后在父节点上调用 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);
}
});
}
}

关于java - JTree:加速从数据库检索的对象中绘制 1000 多个子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7961626/

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