我只是想知道......如何阻止主线程,因为JOptionPane(它的确认对话框)能够执行,直到它返回一些值为止?我之前从未这样做过,所以我有兴趣找到一种最佳方式......
更清楚我有兴趣将这个概念表达为类似的东西,但我不知道如何让它等到popupmenu中发生事件,例如:
...
int a;
int x;
void showPopup()
{
a=MyPopupMenu.aPopupMenu();
if(a==0){System.out.println("YES");}
if(a==1){System.out.println("NO"); return;}
x++;
}
由于
答案 0 :(得分:2)
您可以直接使用JOptionPane
的实例,而不是使用静态JDialog
方法,允许您自定义其行为,例如modality。
答案 1 :(得分:2)
使用wait / notify。主线程将:
synchronized(object) {
object.wait(timeOut);
}
对于你正在使用的任何GUI(你的例子中都是一个弹出窗口),和处理程序(即监听器)都可以:
synchronized(object) {
object.notify();
}
这是一个使用wait / notify
的精简教学示例public class ModalPopUp {
JPopupMenu popUpMenu;
JMenuItem menuItem;
static Object modalMonitor = new Object();
public void popIt(Component parent, int x, int y) {
popUpMenu.show(parent, x, y);
}
public void stopIt() {
popUpMenu.setVisible(false);
}
public ModalPopUp() {
popUpMenu = new JPopupMenu();
menuItem = new JMenuItem("Click me to Continue");
popUpMenu.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
synchronized (modalMonitor) {
modalMonitor.notify();
}
}
});
}
public static void main(String args[]) throws Exception {
ModalPopUp p = new ModalPopUp();
JFrame frame = new JFrame();
frame.setSize(400, 400);
frame.setVisible(true);
p.popIt(null, 100, 100);
System.out.println("Waiting upto 42s for popup click");
synchronized (modalMonitor) {
modalMonitor.wait(42000);
}
p.stopIt();
System.out.println("Popup was clicked or 42s passed");
}
}