java - JTree setSelectionPaths 展开时间太长

标签 java swing jtree

我正在使用 JTree 并选择树中的所有节点 (Ctrl-A)。我的树包含 14000 个 parent ,每个 parent 都有一个 child ,所以树总共包含 28000 个节点。以下是代码片段:

@Override public final void setSelectionPaths(TreePath[] aPaths)
  {
    if (aPaths != null)
   {

   for (TreePath path : aPaths)
   {
       TreePath parentPath = path.getParentPath();
       if (parentPath != null)
        {
          expandPath(path.getParentPath());
        }
      }
    }
    super.setSelectionPaths(aPaths);
  }

伸展树(Splay Tree)需要 20 分钟。有什么办法可以优化吗?

最佳答案

我发现在记录选择的路径之后,如果在展开之前重置选择,速度会快得令人难以置信。

final TreePath[] paths = tree.getSelectionPaths();
//Modifying the selection makes it run a whole lot faster
tree.setSelectionPath(paths[0]);
for(int i = 0; i < paths.length; i++){
    tree.expandPath(paths[i]);
}

我认为这是因为它不必再对选择做那么多魔术了。

由于害怕被殴打和待命,我会提供这个建议。如果你想在这个过程中让 GUI 保持解锁状态,你可以把它扔到一个新的线程上(而不是在 EDT 上)。当然,您必须非常小心,不要试图与 Tree 进行交互 - Swing 不是线程安全的,因此除了查看它之外的任何其他操作都会导致各种奇怪的问题。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.tree.*;

public class JTreeExpanding extends Box{

    //Just to make sure no user interactions happen during expansion
    JPanel glassPane = new JPanel(){
        public void paintComponent(Graphics g){
            g.setColor(new Color(0,0,0,80));
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.white);
            g.setFont(g.getFont().deriveFont(18f).deriveFont(Font.BOLD));
            g.drawString("Processing...", getWidth()-100, getHeight()-10);
        }
    };

    public JTreeExpanding(){
        super(BoxLayout.Y_AXIS);

        glassPane.setOpaque(false);

        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        for(int i = 0; i < 14000; i++){
            DefaultMutableTreeNode node = new DefaultMutableTreeNode("Root" + i);
            node.add(new DefaultMutableTreeNode("Child" + i));
            root.add(node);
        }   

        final JTree tree = new JTree(root);
        tree.setRootVisible(false);
        final JScrollPane pane = new JScrollPane(tree);
        add(pane);

        JButton button = new JButton("Expand");
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                //Taking the expand off the EDT frees up GUI 
                Thread t = new Thread(new Runnable(){
                    @Override
                    public void run() {
                        final TreePath[] paths = tree.getSelectionPaths();
                        //Modifying the selection makes it run a whole lot faster
                        tree.setSelectionPath(paths[0]);
                        for(int i = 0; i < paths.length; i++){
                            tree.expandPath(paths[i]);
                        }
                        glassPane.setVisible(false);
                    }});

                getRootPane().setGlassPane(glassPane);
                glassPane.setVisible(true);
                t.start();
            }});
        add(button);

        //Allow Scrolling in scroll pane while Tree is expanding
        glassPane.addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                for(MouseWheelListener mwl : pane.getMouseWheelListeners()){
                    mwl.mouseWheelMoved(e);
                }
            }
        });

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new JTreeExpanding());
        frame.validate();
        frame.pack();
        frame.setVisible(true);
    }

}

关于java - JTree setSelectionPaths 展开时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832847/

相关文章:

java - 使用 EJB 的 Swing 应用程序

java - 为什么延迟加载在一对一关联中不起作用?

java - 不断收到 nullpointerException?我正在尝试打印图像

Java - 使用 GUI 和 2D 图形

java - 在多任务应用程序中管理 GUI 和 EDT

java - jtree 让用户通过 "blinking"查看更新(颜色快速变化)

Java 是否用 null 初始化变量?

javax.ws.rs.NotFoundException : Could not find resource for full path with RESTEasy and Wildfly 8. 1.0.Final

java - 如何计算 JTree 中的节点数?

java - 更改 TreeNode 的名称而不更改 userObject