java - 如何像 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){System.out.println("NO"); return;}

  x++; 
}

谢谢

最佳答案

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

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

关于java - 如何像 JOptionPane 那样阻塞主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952049/

相关文章:

java - 使用 jsonpath 解析数组索引

java - 想让我的数据库搜索更有效率

java - 如何在 MigLayout 中显示 JLabel 省略号?

java - 在后台处理某些工作时显示带有动画 gif 的 JDialog

java - JDialog : Making some portion transparent

Java 内存分析显示异常的对象分配和释放

java - 检查 String 是否只有特定的重复特殊字符

java - 如何在mouseDragged事件下的DRAG_LAYER上添加JLabel

java - 如何在 Java 中向下移动表格?

java - 向 JDialog 添加按钮?