Определите, сколько контейнеров верхнего уровня открыто - PullRequest
0 голосов
/ 09 июня 2011

Какой метод может вернуть, как узнать количество открытых контейнеров верхнего уровня

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SuperConstructor extends JFrame {

    private static final long serialVersionUID = 1L;

    public SuperConstructor() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        setTitle("Super constructor");
        Container cp = getContentPane();
        JButton b = new JButton("Show dialog");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                FirstDialog firstDialog = new FirstDialog(SuperConstructor.this);
            }
        });
        cp.add(b, BorderLayout.SOUTH);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SuperConstructor superConstructor = new SuperConstructor();
            }
        });
    }

    private class FirstDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent) {
            super(parent, "FirstDialog");
            setPreferredSize(new Dimension(200, 200));
            setLocationRelativeTo(parent);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
            JButton bNext = new JButton("Show next dialog");
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    SecondDialog secondDialog = new SecondDialog(parent, false);
                }
            });
            add(bNext, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
    private int i;

    private class SecondDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        SecondDialog(final Frame parent, boolean modal) {
            //super(parent); // Makes this dialog unfocusable as long as FirstDialog is visible
            setPreferredSize(new Dimension(200, 200));
            setLocation(300, 50);
            setModal(modal);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setTitle("SecondDialog " + (i++));
            JButton bClose = new JButton("Close");
            bClose.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            add(bClose, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Window [] allWindows = Window.getWindows ();

1 голос
/ 09 июня 2011

Поскольку J2EE использует слово «контейнер» в очень конкретном значении этого слова, вам лучше сказать «сколько диалогов верхнего уровня» в вашем примере. Обратите внимание, что в Swing «верх» также имеет очень специфическое значение, поэтому может быть только один «верхний» элемент, элемент, который (или будет) нарисован поверх всех других элементов. Поскольку ответ «один», скорее всего, не тот, который вам нужен, я предполагаю, что вы действительно имели в виду «Сколько диалогов открыто?»

Способ подсчета открытых диалогов заключается в добавлении в ваш класс SuperConstructor члена, который может содержать «количество» открытых диалогов. В слушателе действий вашей кнопки вы создаете новый диалог. Вы можете поместить код для увеличения счетчика в классе, представляющем диалог, или в слушателе действия, который создал диалог. Любая техника хороша, но если вам нужно предпочтение, я предпочитаю поместить его в слушатель действия (встроенный в класс SuperConstructor).

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

Обратите внимание, что установка диалога в Visible - это не то же самое, что удаление диалога, поэтому будьте осторожны или смотрите на видимость или существование (в зависимости от ваших желаний), но не пишите код, который увеличивается на существование, но уменьшается на видимость (или наоборот).

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