Я создаю 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()
.