【发布时间】:2014-04-13 19:15:55
【问题描述】:
在下面的示例中,模式对话框在事件调度线程内打开。由于对话框是模态的,方法setVisible()在关闭之前不会返回。
有人可能会怀疑这是导致事件调度线程暂停,但这是错误的,因为按钮正在运行。
因此,setVisible() 方法没有阻塞线程。
问题是:是否可以在不阻塞过程的情况下显示模态对话框?
package tests.javax.swing;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Try_JDialog_Modality2 {
private static final Logger log = LoggerFactory.getLogger(Try_JDialog_Modality2.class);
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
AbstractAction popupAction = new AbstractAction("popup") {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "popup");
}
};
JDialog dialog = new JDialog((JFrame)null, true);
dialog.setLayout(new FlowLayout());
dialog.add(new JButton(popupAction));
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
log.debug("After set visible");
}
});
}
}
更新
我可以用下面的 sn-p 做同样的事情:
//dialog.setVisible(true);
new Thread(new Runnable() {
@Override
public void run() {
dialog.setVisible(true);
}
}).start();
log.debug("After set visible");
有没有更短的方法?
【问题讨论】:
标签: java multithreading swing modal-dialog