【发布时间】:2019-10-19 17:17:50
【问题描述】:
我希望 JOptionPane 出现在无模式对话框上方。例如,在以下应用程序中,请按JDialog 按钮显示无模式对话框,然后按JOptionPane 按钮显示JOptionPane 确认对话框。不幸的是,JOptionPane 出现在无模式对话框下。
在我的真实应用程序中,我有几个无模式的 JDialog,我从几个不同的地方使用 JOptionPane。
我如何轻松让 JOptionPane 出现在所有无模式的 JDialog 实例之上? “轻松”是指在每个无模式 JDialog 构造或每个 JOptionPane 调用中添加 1 或 2 行。
我尝试的一种方法是创建一个新的临时无主 JFrame,它具有始终位于顶部的选项作为 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);
}
}
【问题讨论】: