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

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

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

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

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

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

如何加快这个绘图过程?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?
Java菜单驱动程序以检查数字类型
使用Junit的Maven项目 - 检查银行账号
JAVA编程基础
在Java中使用throw、catch和instanceof来处理异常
在Java中,将数组分割为基于给定查询的子数组后,找到子数组的最大子数组和
如何在Java中从给定的字符串中删除HTML标签?
在PHP中,IntlChar getBlockCode()函数的翻译如下:
如何在Android中实现按下返回键再次退出的功能?
如何使用Java中的流式API解析JSON字符串?
Java中的模式类