Как получить ссылку на отображаемое окно Java Swing JDialog? - PullRequest
2 голосов
/ 19 августа 2009

Я использую инфраструктуру на основе Java Swing, которая показывает всплывающие сообщения с использованием полей Java Swing JDialog. Мне нужно получить справку о них, чтобы я мог закрыть их программно. Каркас создает диалоговые окна, но не сохраняет ссылки на них. Могу ли я получить ссылку на отображаемое в данный момент поле?

Спасибо.

Ответы [ 7 ]

4 голосов
/ 20 августа 2009

Попробуйте это:

import java.awt.Window;
import javax.swing.JDialog;

public class Test {
    public static void main(String[] args) {
        JDialog d = new JDialog((Window)null,"Demo Dialog");
        for (Window w : JDialog.getWindows()) {
            if ( w instanceof JDialog) {
                System.out.println(((JDialog)w).getTitle());
            }
        }
    }
}

И если вы озадачены:

(Window)null

cast, просто попробуйте скомпилировать без него:)

(Кстати, передача нулевого окна в конструктор создает неиспользуемый диалог)

РЕДАКТИРОВАТЬ: обратите внимание, что это даст вам ссылки на ВСЕ диалоговые окна независимо от того, видны ли они, как демонстрирует код. Чтобы исправить это, просто запросите диалог о том, виден ли он, используя isVisible ()

2 голосов
/ 20 августа 2009

Если вы хотите получить ссылку на самый передний JDialog, вам нужно прослушать события AWT, обновить эту ссылку "вживую" и сохранить ее где-нибудь.

Вот что я делаю в своей собственной среде Swing:

public class ActiveWindowHolder
{
    public DefaultActiveWindowHolder()
    {
        _current = null;
        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
        {
            public void eventDispatched(AWTEvent e)
            {
                DefaultActiveWindowHolder.this.eventDispatched(e);
            }
        }, AWTEvent.WINDOW_EVENT_MASK);
    }

    public Window getActiveWindow()
    {
        return _current;
    }

    private void eventDispatched(AWTEvent e)
    {
        switch (e.getID())
        {
            case WindowEvent.WINDOW_ACTIVATED:
            _current = ((WindowEvent) e).getWindow();
            break;

            case WindowEvent.WINDOW_DEACTIVATED:
            _current = null;
            break;

            default:
            // Do nothing (we are only interested in activation events)
            break;
        }
    }

    private Window _current;    
}

Просто убедитесь, что вы создали ActiveWindowHandler в своем основном потоке, прежде чем показывать какой-либо компонент; с этого момента при каждом вызове ActiveWindowHandler.getActiveWindow() будет возвращаться самое переднее окно (либо JDialog из JFrame).

1 голос
/ 19 августа 2009

Вы можете получить ссылку на все ваши дочерние окна, используя метод getWindows () класса Window.

public static Window[] getWindows()

    Returns an array of all Windows, both owned and ownerless, created by this application. If called from an applet, the array includes only the Windows accessible by that applet.

Будьте осторожны, так как я подозреваю, что одно из возвращенных окон будет вашим фреймом / окном верхнего уровня. Вы можете проверить атрибуты окна, такие как заголовок, чтобы определить, какой диалог вы хотите закрыть.

Существуют также более конкретные версии: getOwnedWindows () и getOwnerlessWindows () в зависимости от ваших потребностей.

0 голосов
/ 20 декабря 2010

либо установите диалог как модальный, что делает вашу жизнь действительно легкой ...
ИЛИ, когда вы инициализируете свой JDialog, есть следующее:

JDialog d = new JDialog();  
d.addWindowListener(new WindowAdapter(){
    public void windowClosed(WindowEvent e){
        dialogClosedAlertFunction(); //goes wherever you want it to go
    }
});
0 голосов
/ 20 августа 2009

Если вы создаете JDialog явно, а не используете JOptionPane.showXXX, у вас уже будет ссылка на диалоговое окно. Это определенно будет моим предпочтительным подходом; например,

JDialog dlg = new JDialog(null, "My Dialog", false); // Create non-modal dialog.
dlg.setLayout(new BorderLayout());
dlg.add(myPanel, BorderLayout.CENTER);
dlg.pack();
dlg.setLocationRelativeTo(null);
dlg.setVisible(true);
0 голосов
/ 19 августа 2009

Окно w = KeyboardFocusManager.getCurrentKeyboardFocusManager (). GetFocusedWindow ();

Затем вы можете проверить и привести его к JDialog.

Но, как я уже говорил в вашем предыдущем вопросе, вы должны изменить свой подход.

0 голосов
/ 19 августа 2009

Я не вижу способа узнать, что в данный момент открыто как дочерний элемент фрейма - я вижу только методы для получения родительских фреймов.

Можете ли вы изменить текущие классы, вызывающие диалоговые окна? Если это так, вы можете добавить контейнер, чтобы отслеживать, как они открываются и закрываются, и добавлять некоторые методы для доступа к этому контейнеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...