Модальный диалог в сочетании с Runtime.exec в Java - PullRequest
1 голос
/ 04 марта 2011

Я запускаю внешнюю программу из Java и ожидаю ее завершения:

Process p = Runtime.getRuntime().exec("notepad");
p.waitFor();

Это вызывается из приложения с графическим интерфейсом, и я хотел бы запретить пользователю делать что-либо в графическом интерфейсе во время работы внешней программы. Уже существует такой механизм, который является модальностью JFrame . Поэтому я подумал, что мог бы создать диалоговое окно, которое также очень удобно могло бы заявить, что пользователь должен выйти из внешней программы, чтобы продолжить, что бы всплыло и заблокировало доступ к GUI:

Process p = Runtime.getRuntime().exec("notepad");

JOptionPane pane = JOptionPane("close the app", JOptionPane.NO_OPTION, JOptionPane.INFORMATION_MESSAGE, [], "Force Exit", "Force Exit");
JDialog dialog = JDialog(frame, "External app", true);
dialog.setContentPane(pane);
dialog.pack();
dialog.setVisible(true);

p.waitFor();
dialog.setVisible(false);

Этот подход, к сожалению, ждет в

  1. dialog.setVisible(true)
  2. p.waitFor()

установка dialog.setModal(false) до dialog.setVisible(true) программа ожидает только завершения внешней программы, а затем закрывает диалоговое окно, но это также позволяет пользователю взаимодействовать с GUI.

Есть идеи?

1 Ответ

0 голосов
/ 23 марта 2011

Нашел способ, который не так уж и плох, я думаю:

// Parent JFrame somewhere
JFrame parent = ....

// Create the dialog content
String str = "Close the external program when done";
Icon i = UIManager.getIcon('OptionPane.informationIcon');
JLabel lb = JLabel(str, i, JLabel.LEFT);
JPanel panel = JPanel();
panel.add(lb);

// Create the dialog window
JDialog dialog = JDialog(parent, "External app", false);  // N.B: NOT modal
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialog.setContentPane(panel); 
dialog.pack(); 
dialog.setVisible(true);  
parent.setEnabled(false);

// start external app
Process p = Runtime.getRuntime().exec("notepad");
p.waitFor();     // wait for it to close

dialog.setVisible(false); 
parent.setEnabled(true);
parent.requestFocus();

Это отключит использование родительского JFrame, пока внешняя программа все еще работает, и ведет себя как модальное диалоговое окно..

...