检测组件的删除
问题描述:
我使用PopupFactory.getPopup
方法创建了Popup
。根据文档,当不再需要弹出窗口时,我需要在弹出框中调用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”的弹出窗口。这个Popup是text1
的孩子。按下“New label”按钮并从显示屏上删除“text1”,但Popup仍然存在。
我需要能够检测text1
或包含panel
何时被删除,以便我可以隐藏弹出窗口。我想避免在调用实际的remove()
方法时添加代码。
答
可以使用的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();
}
谢谢你,彼得。这很好用! – oz1cz 2012-01-06 16:31:16