Определить удаление компонента - PullRequest
3 голосов
/ 06 января 2012

Я создаю Popup, используя метод PopupFactory.getPopup.Согласно документации, я должен вызывать метод hide() во всплывающем окне, когда он больше не нужен.

В моем приложении всплывающее окно является дочерним элементом JLabel, который может быть удален изтекущий кадр в ряде разных ситуаций.(Либо сам JLabel, либо один из его родительских контейнеров удаляется.) Вместо того, чтобы вызывать hide() в каждом отдельном месте (и сделать объект Popup доступным во всех этих местах), я бы предпочел иметь возможность обнаруживатьудаление JLabel или одного из его родительских контейнеров.

Как я могу обнаружить удаление?Я наивно полагал, что удаление компонента означало удаление / скрытие его дочерних элементов, но, как показано в приведенном ниже коде, всплывающее окно переживает удаление JLabel.

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

public class Xyzzy extends JFrame {
    static Xyzzy frame;
    static JPanel panel;
    static JLabel text1;
    static JLabel text2;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    frame = new Xyzzy();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));

                    panel = new JPanel();
                    panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
                    frame.add(panel);


                    text1 = new JLabel("text1");
                    text2 = new JLabel("text2");

                    panel.add(text1);

                    frame.add(new JButton(new AbstractAction("Add popup") {
                            public void actionPerformed(ActionEvent e) {
                                PopupFactory factory = PopupFactory.getSharedInstance();
                                Popup popup = factory.getPopup(text1, new JLabel("POPUP"),frame.getX()+300,frame.getY()+300);
                                popup.show();
                            }
                        }));

                    frame.add(new JButton(new AbstractAction("New label") {
                            public void actionPerformed(ActionEvent e) {
                                panel.remove(text1);
                                panel.add(text2);
                                panel.revalidate();
                            }
                        }));

                    frame.setSize(600, 600);
                    frame.setVisible(true);
                }
            });
    }
}

Этот код создает JFrame отображение текста «text1» и двух кнопок.Если вы нажмете кнопку «Добавить всплывающее окно», появится всплывающее окно с текстом «POPUP».Это всплывающее окно является ребенком text1.Нажмите кнопку «Новая метка», и «text1» будет удалено с дисплея, но всплывающее окно сохранится.

Мне нужно определить, когда text1 или содержащий panel удалены, чтобы я могможно скрыть всплывающее окноЯ хочу избежать добавления кода, где вызывается фактический метод remove().

1 Ответ

4 голосов
/ 06 января 2012

Вы можете использовать HierarchyListener:

public void actionPerformed(ActionEvent e) {
  PopupFactory factory = PopupFactory.getSharedInstance();
  final Popup popup = factory.getPopup(text1, new JLabel("POPUP"),frame.getX()+300,frame.getY()+300);
  text1.addHierarchyListener(new HierarchyListener() {

    public void hierarchyChanged(HierarchyEvent e) {
      if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED
          && (e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
        popup.hide();
      }
    }
  });
  popup.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...