Получение ссылки на объект, созданный статическими методами JOptionPane - PullRequest
5 голосов
/ 28 декабря 2010

Интересно, возможно ли получить ссылку на объект (JDialog?), Созданный одним из этих статических методов JOptionPane (например, showMessageDialog)?Я намереваюсь изменить положение, где диалоговое окно появляется на экране.В частности, я хочу, чтобы диалог отображался в верхнем левом углу главного окна приложения, а не в центре окна по умолчанию.Таким образом, наличие ссылки на объект позволило бы мне использовать setLocation для достижения желаемого эффекта ...

Любое предложение будет оценено!Спасибо!

Ответы [ 2 ]

7 голосов
/ 28 декабря 2010

Статические 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.

EDITED : (добавить пример диалога ввода для 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();
0 голосов
/ 28 декабря 2010

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");
...