我建造了一个有点荒谬的大面板,想要显示它。不幸的是,当我跑步时
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();
}
});
}
}