为什么我的Swing应用程序在JScrollPane.setViewportView上冻结了很长时间?

时间:2014-04-27 17:48:19

标签: java swing jpanel jscrollpane swingworker

我建造了一个有点荒谬的大面板,想要显示它。不幸的是,当我跑步时

scrollPane.setViewportView(absurdPanel);

完成操作需要相当荒谬的时间。有什么建议?我最关心的是因为我希望用户能够以交互方式设置面板大小,而且能够在中间取消操作。由SwingWorkers合理地正确完成面板创建,因此唯一的主要UI暂停位于setViewportView

简单破解示例

这并不完全是我正在做的事情的摘录,但它应该得到一般的想法。请注意打印时间与#34; foo"之间的延长暂停时间。当它打印" bar"。

import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

@SuppressWarnings("serial")
public class Broken extends JScrollPane {
    JPanel foo;

    Broken() {
        super();
        foo = new JPanel();
        foo.setLayout(new BoxLayout(foo, BoxLayout.PAGE_AXIS));
    }

    void ruin() {
        for (int x = 0; x < 200000; x++) {
            try {
                SwingUtilities.invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        foo.add(new JLabel("What is this nonsense?"));
                    }
                });
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                final Broken broken = new Broken();
                frame.setContentPane(broken);
                frame.setVisible(true);
                new SwingWorker<Void, Void>() {
                    @Override
                    public Void doInBackground() {
                        broken.ruin();
                        return null;
                    }

                    @Override
                    public void done() {
                        System.out.print("foo");
                        broken.setViewportView(broken.foo);
                        System.out.print("bar");
                    }
                }.execute();
            }
        });
    }
}

0 个答案:

没有答案
相关问题