2012-01-06 41 views
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()方法時添加代碼。

回答

3

可以使用的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(); 
} 
+0

謝謝你,彼得。這很好用! – oz1cz 2012-01-06 16:31:16