JTree:从数据库中检索的对象中加速绘制1000+子节点



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

问题是把这些物体画到Jtree上。

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

问题是这个jtree绘制操作需要很长时间才能完成为所选父节点添加1000+子DefaultMutableTreeNodes

ex) 1000 of new DefaultMutableTreeNode(Person person);

如何加快这个绘图过程?

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

你需要时间的减速是,但我怀疑它只是创建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);
            }
        });
    }
}

您可能正在创建1000+ DefaultMutableTreeNodes来放置您的列表。问题是快速创建那么多对象,并将对象转换为DefaultMutableTreeNode。如果您不创建所有这些对象,您可以提高性能。我建议只是写你自己的TreeModel的实现,它直接与你的对象模型一起工作,这样你就不必重新创建那么多对象。这将极大地提高你的速度。我之前在JTree中放置了10,000个对象(我这样做了,但这可能不是一个好主意),但我必须编写我自己的TreeModel,所以我不必重新创建这些对象。

但是,对于所有性能问题,您应该首先对其进行分析,以找出您在哪里花费了时间并解决该问题。如果结果是这个问题,那么你可以这样做。您不需要尝试创建自己的图形绘制例程,因为这比编写自己的TreeModel要多得多。

另一个选择是在需要时按需获取树。当用户展开每个节点时获取根节点从服务器获取其子节点。无论如何,用户无法一次查看所有1000多个节点,因此这将大大减少您通过网络传输的数量,并减少在服务器上花费的时间。

使用JPanel为图形编写自己的JTree: p

或者您可以创建一个类扩展JTree并覆盖paint(Graphics g)方法

最新更新