Мне нужно создать диалог, который не блокирует ввод в другие окна, но блокирует вызывающую программу, чтобы я знал, когда диалог был закрыт.
Обычно я решаю эту проблему не путем блокировки вызывающей стороны, а с помощью какого-либо обратного вызова - простого интерфейса, который вызывается диалогом, когда это сделано. Допустим, в вашем диалоговом окне есть кнопка «ОК» и «Отмена», и вам нужно различить, какая из них нажата. Тогда вы могли бы сделать что-то вроде этого:
public interface DialogCallback {
void ok();
void cancel();
}
public class MyModelessDialog extends JDialog {
private final DialogCallback cbk;
private JButton okButton, cancelButton;
public MyModelessDialog(DialogCallback callback) {
cbk = callback;
setModalityType(ModalityType.MODELESS);
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onOK();
}
};
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
};
// Treat closing the dialog the same as pressing "Cancel":
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onCancel();
}
};
}
private void onOK() {
cbk.ok();
}
private void onCancel() {
cbk.cancel();
}
}
Затем вы просто передаете экземпляр DialogCallback конструктору:
MyModelessDialog dlg = new MyModelessDialog(new DialogCallback() {
public void onOK() {
// react to OK
}
public void onCancel() {
// react to Cancel
}
});
EDIT
Есть ли какое-то обоснование, почему поведение setVisible зависит от модальности?
Ну, вот как именно модальные окна должны работать, нет? Модальное окно должно блокировать текущий рабочий процесс при отображении, а немодальное / немодальное не должно. Смотрите, например страницы Википедии в модальных окнах или диалоговых окнах .