Как мне найти окно, открытое на качелях? - PullRequest
9 голосов
/ 05 мая 2011

У меня проблема с моим приложением, когда пользователь будет открывать более одного окна одновременно.И я добавил метод dispose () для вызова при закрытии окна.Теперь я должен держать хотя бы одно окно открытым все время, чтобы приложение не скрывалось без полного закрытия.Если вы не понимаете, прочитайте следующий сценарий:

У меня есть окно A и окно B, открытые одновременно.Теперь я могу закрыть окно A или окно B, но не оба одновременно.Другими словами, окно B должно быть закрыто, только если открыто окно A, и наоборот.Как мне сделать это в разгаре ??

Ответы [ 3 ]

16 голосов
/ 05 мая 2011

Простой вид WindowManger не так уж и сложен, все что вам нужно, это

  • WindowListener, который отслеживает Windows, которую он слушает
  • определенное место для создания окон и регистрации слушателя
  • заставляет окна ничего не делать при закрытии и заставляет слушателя принимать решение о том, закрывать или нет (будет делать это для всех, кроме последнего)

Небольшой фрагмент:

    // the listener (aka: WindowManager)
    WindowListener l = new WindowAdapter() {
        List<Window> windows = new ArrayList<Window>();

        @Override
        public void windowOpened(WindowEvent e) {
            windows.add(e.getWindow());
        }

        @Override
        public void windowClosing(WindowEvent e) {
            if (windows.size() > 1) {
                windows.remove(e.getWindow());
                e.getWindow().dispose();
            }
        }
    };
    // create the first frame
    JFrame frame = createFrame(l);
    frame.setVisible(true);


// a method to create a new window, config and add the listener
    int counter = 0;
    private JFrame createFrame(final WindowListener l) {
        Action action = new AbstractAction("open new frame: " + counter) {

            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame frame = createFrame(l);
                frame.setVisible(true);

            }
        };
        JFrame frame = new JFrame("someFrame " + counter++);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.add(new JButton(action));
        frame.addWindowListener(l);
        frame.pack();
        frame.setLocation(counter * 20, counter * 10);
        return frame;
    }
4 голосов
/ 05 мая 2011

Просто возможный подход ...

Создайте класс, назовите его WindowManager, который управляет созданием и удалением окон.

Например, он может сохранить счет окон, открытых в данный момент, и разрешают операцию удаления только в том случае, если существует более одного «живого» окна, в противном случае отображается подтверждающее сообщение с JOptionPane, сообщающее пользователю «Действительно закрыто? Это приведет к прекращению работы приложения».или что-то в этом роде.

"Хитрая" часть заключается в том, что вы должны выполнять подобные операции с окнами на протяжении WindowManager, иначе все облажалось бы.

Не знаю, если Swingесть что-то вроде этого встроенного, я никогда не видел такой сценарий.

1 голос
/ 05 мая 2011

просто проверьте, открыто ли другое окно перед закрытием с помощью window.isVisible ();

...