我想知道是否有可能获得对由JOptionPane的一个静态方法(例如showMessageDialog)创建的(JDialog?)对象的引用?我打算修改对话框出现在屏幕上的位置。更具体地说,我希望对话框显示在主应用程序窗口的左上角,而不是默认情况下窗口的中心。因此,引用该对象将使我能够使用setLocation来实现所需的效果......
任何建议将不胜感激!谢谢!
答案 0 :(得分:7)
静态showXXXDialog()
方法只是为了方便起见。如果查看JOptionPane
的源代码,您会发现实际上,基于您指定的选项创建了JOptionPane
对象,然后调用JOptionPane.createDialog(...)
。在不同位置显示消息对话框的一种方法是:
JOptionPane pane = new JOptionPane("Message", JOptionPane.WARNING_MESSAGE,
JOptionPane.DEFAULT_OPTION);
JDialog dialog = pane.createDialog("TITLE");
dialog.setLocation(0, 0);
dialog.setVisible(true);
// dialog box shown here
dialog.dispose();
Object selection = pane.getValue();
通过JOptionPane
构造函数和JOptionPane
设置方法的参数组合,您可以执行使用静态方法所做的任何操作,并且可以访问JDialog
对象本身。
已编辑 :(为OP添加输入对话框示例)
JOptionPane pane = new JOptionPane("Message", JOptionPane.QUESTION_MESSAGE,
JOptionPane.OK_CANCEL_OPTION, null, null, null);
pane.setWantsInput(true);
JDialog dialog = pane.createDialog(null, "Title");
dialog.setLocation(0, 0);
dialog.setVisible(true);
String str = (String) pane.getInputValue();
答案 1 :(得分:0)
JOptionPane将使用给定的parentComponent
(第一个方法参数)来确定对话框的居中位置(例如,在javax.swing.JOptionPane.showMessageDialog(Component,Object)中)
您可以尝试传入一个伪造的组件,将对话框定位到另一个位置,例如:
JFrame frame = new JFrame("Test");
frame.setLocation(100, 100);
frame.setSize(500, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 'Invisible' fake component for positioning
JWindow c = new JWindow();
c.setSize(0, 0);
c.setVisible(true);
Point location = frame.getLocation();
location.translate(200, 100);
c.setLocation(location);
JOptionPane.showInputDialog(c,"Foo");