3
我使用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()
方法時添加代碼。
謝謝你,彼得。這很好用! – oz1cz 2012-01-06 16:31:16