如何像JOptionPane一样阻止主线程?

时间:2012-03-31 00:50:20

标签: java swing jdialog joptionpane

我只是想知道......如何阻止主线程,因为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++; 
}

由于

2 个答案:

答案 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");
}
}