我一直在使用以下方法创建组件,并将值从Swing返回到EDT之外。例如,下面的方法可以是对JFrame的扩展,以创建JPanel并将其添加到父JFrame
public JPanel threadSafeAddPanel() {
final JPanel[] jPanel = new JPanel[1];
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
jPanel[0] = new JPanel();
add(jPanel[0]);
}
});
} catch (InterruptedException ex) {
} catch (InvocationTargetException ex) {
}
return jPanel[0];
}本地1长数组用于从Runnable内部传输“结果”,该结果在EDT中被调用。嗯,看起来“有点”讨厌,所以我的问题是:
发布于 2010-03-08 13:45:08
SwingWorker
Runnable --有一个类是为这类事情明确设计的:发布于 2010-03-09 00:25:40
虽然这种方法在某些情况下可能是有意义的,但它在大多数情况下都是无用的。
原因是大部分(如果不是全部)组件的创建总是从EDT中发生,这是用户操作(单击菜单项或按钮)的结果,这些操作总是从EDT执行的。
如果在创建面板之前有大量工作要执行,并且不想阻止EDT,那么您应该按照其他人的建议,使用SwingWorker或Swing框架来支持长任务(通常是基于内部的SwingWorker,但不一定是这样)。
关于你的第二个问题,不幸的是,你没有很多方法可以做到这一点:
solution
。
下面是简化的ItemHolder类:
public class ItemHolder<T> {
public void set(T item) {...}
public T get() {...}
private T item;
}发布于 2010-03-08 13:40:40
invokeAndWait call之外创建JPanel
//这一行加起来是为了平抑下来
public JPanel threadSafeAddPanel() {
final JPanel jPanel = new JPanel();
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
add(jPanel);
}
});
} catch (InterruptedException ex) {
} catch (InvocationTargetException ex) {
}
return jPanel;
}https://stackoverflow.com/questions/2401605
复制相似问题