как заблокировать основной поток, как это делает JOptionPane? - PullRequest
2 голосов
/ 31 марта 2012

Мне просто интересно ... Как заблокировать основной поток, как 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 ]

2 голосов
/ 01 апреля 2012

Используйте ожидание / уведомление.Основной поток будет делать:

synchronized(object) {
    object.wait(timeOut);
}

, а обработчик (т.е. слушатель) для любого используемого вами графического интерфейса (всплывающее окно в вашем примере) будет:

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");
}
}
2 голосов
/ 31 марта 2012

Вместо использования статических методов JOptionPane вы можете напрямую использовать экземпляр JDialog, что позволяет настраивать его поведение, например, модальность .

...