Java 如何像JOptionPane那样阻止主线程?

Java 如何像JOptionPane那样阻止主线程?,java,swing,jdialog,joptionpane,Java,Swing,Jdialog,Joptionpane,我只是想知道。。。如何像JOptionPane(它的确认对话框)那样阻止主线程,以便能够保持执行直到它返回一些值?我以前从未做过,所以我有兴趣找到一个最佳的方法 更清楚地说,我有兴趣用这样的方式来表达这个概念,但我不知道如何让它等到弹出菜单中的事件发生时再使用,例如: ... int a; int x; void showPopup() { a=MyPopupMenu.aPopupMenu(); if(a==0){System.out.println("YES");} if(a==1){

我只是想知道。。。如何像JOptionPane(它的确认对话框)那样阻止主线程,以便能够保持执行直到它返回一些值?我以前从未做过,所以我有兴趣找到一个最佳的方法

更清楚地说,我有兴趣用这样的方式来表达这个概念,但我不知道如何让它等到弹出菜单中的事件发生时再使用,例如:

...
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++; 
}

谢谢

不用静态的
JOptionPane
方法,您可以直接使用
JDialog
的实例,允许您自定义其行为,例如


您可以直接使用
JDialog
的实例,而不是使用静态
JOptionPane
方法,从而允许您自定义其行为,例如


使用等待/通知。主线程将执行以下操作:

synchronized(object) {
    object.wait(timeOut);
}
您正在使用的任何GUI(示例中的弹出窗口)的处理程序(即侦听器)将执行以下操作:

下面是一个使用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");
}
}

使用等待/通知。主线程将执行以下操作:

synchronized(object) {
    object.wait(timeOut);
}
您正在使用的任何GUI(示例中的弹出窗口)的处理程序(即侦听器)将执行以下操作:

下面是一个使用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");
}
}

主线程不会停止,只是当您调用该方法以显示对话框时,该方法不会返回,直到用户使用完它。主线程继续执行,只是它被卡在dialog类中的某个循环中。对话框上的这种行为称为模态-如果对话框是模态的,那么在对话框关闭之前,用户不能与对话框之外的任何东西进行交互。好的,但是如果我想模拟“模态”呢?有什么办法吗?发布你有问题的代码。实际上,我没有代码问题,但有一些概念上的问题:)所以我想知道我能不能用JPOppMenu获得“模态”效果?例如,为什么你想激怒你的用户;-)主线程不会停止,只是当您调用该方法以显示对话框时,该方法不会返回,直到用户使用完它。主线程继续执行,只是它被卡在dialog类中的某个循环中。对话框上的这种行为称为模态-如果对话框是模态的,那么在对话框关闭之前,用户不能与对话框之外的任何东西进行交互。好的,但是如果我想模拟“模态”呢?有什么办法吗?发布你有问题的代码。实际上,我没有代码问题,但有一些概念上的问题:)所以我想知道我能不能用JPOppMenu获得“模态”效果?例如,为什么你想激怒你的用户;-)我很想使用JDialog或其他类似的工具,但我对任何Swing组件的“模态效果”很感兴趣,例如:我看到了像a这样的代码,但它使用SwingWorker;我不太确定它在问题案例中是否有效?我很想使用JDialog或这方面的一些常用工具,但我感兴趣的是获得任何Swing组件的“模态效果”,例如:S我看到像a这样的代码,但它使用SwingWorker;我不太确定它在疑问句中会起作用吗?我试过这个,但是如果我把等待部分放在aPopupMenu()方法体的末尾,弹出菜单永远不会显示:(你能提供更多细节吗)我试过这个,但是如果我把等待部分放在aPopupMenu()方法体的末尾,弹出菜单永远不会显示:(你能提供更多细节吗