Я хочу, чтобы JOptionPane появлялся над немодальными диалогами. Например, в следующем приложении нажмите кнопку JDialog
, чтобы отобразить немодальное диалоговое окно, а затем нажмите кнопку JOptionPane
, чтобы отобразить диалоговое окно подтверждения JOptionPane. К сожалению, JOptionPane появляется под немодальным диалогом.
В моем реальном приложении у меня есть несколько немодальных JDialogs, и я использую JOptionPane из нескольких разных мест.
Как я могу легко сделать так, чтобы панель JOptionPane отображалась над всеми немодальными экземплярами JDialog?
Под «легко» я подразумеваю добавление 1 или 2 строк к каждой немодальной конструкции JDialog или к каждому вызову JOptionPane.
Один из способов, которым я пытался сделать, - создать новый временный JFrame, не имеющий доступа, с опцией Always-on-top в качестве владельца JOptionPane. Это делает JOptionPane сверху, но JOptionPane находится в центре экрана, а не в центре оригинального JFrame, и я беспокоюсь, что пользователь может этого не заметить.
Другой способ, которым я пытался сделать, - сделать все немодальные диалоги невидимыми, прежде чем показывать панель JOptionPane, а затем снова сделать их видимыми. Но этот способ нелегко обойти все вызовы JOptionPane, потому что (я полагаю) для надежной работы требуется блок try-finally.
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
public class App {
public static void main(String[] args) {
JFrame f = new JFrame("App Frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btnDialog = new JButton("JDialog");
JButton btnOptionPane = new JButton("JOptionPane");
btnDialog.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog dlg = new JDialog(f, "Modeless Dialog", false);
dlg.setSize(256, 256);
dlg.setLocationRelativeTo(f);
dlg.setVisible(true);
}
});
btnOptionPane.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showConfirmDialog(f, "Confirm JOptionPane");
}
});
f.add(btnDialog, BorderLayout.WEST);
f.add(btnOptionPane, BorderLayout.EAST);
f.setSize(512, 512);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}