2012-03-31 2 views
2

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

Хорошо, но что, если я хочу симулировать «модальность»? Есть ли способ? – user592704

+0

Отправьте код, с которым у вас возникла проблема. – Java42

ответ

2

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

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

Я пробовал это, но если я положил часть ожидания в конец тела метода aPopupMenu(), popupmenu никогда не показывает :(Не могли бы вы дать более подробную информацию, пожалуйста, – user592704

+0

@ user592704. Я отредактирую и добавлю образец. – Java42

2

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

+0

Я бы хотел использовать JDialog или что-то обычное в этом направлении, но мне интересно получить «эффект модальности» для любого компонента Swing, например: SI пишут коды, такие как http://stackoverflow.com/a/ 1595795/592704, но он использует SwingWorker; Я не уверен, будет ли это работать в вопросе? – user592704

 Смежные вопросы

  • Нет связанных вопросов^_^