2012-01-06 7 views
3

メソッドを使用してPopupを作成します。ドキュメントによると、私はそれがもはや必要でないときにポップアップでhide()メソッドを呼び出す必要があります。コンポーネントの除去を検出します。

私のアプリケーションでは、ポップアップはJLabelの子であり、さまざまな状況で現在のフレームから削除される可能性があります。 (JLabel自体またはその親コン​​テナの1つが削除されます)その代わりに、すべての場所でhide()を呼び出して(Popupオブジェクトを利用可能にする)、JLabelまたは1の削除を検出できるようにすることをお勧めします親コンテナの

削除はどのように検出できますか?私は素朴に、コンポーネントの削除は子供の削除/隠れを意味すると仮定していましたが、以下のコードが示しているように、ポップアップは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); 
       } 
      }); 
    } 
} 

このコードでは、テキスト「text1」と2つのボタンを表示するJFrameが作成されます。 「ポップアップを追加」と表示されたボタンを押すと、ウィンドウに「POPUP」というテキストのポップアップが表示されます。このポップアップは、text1の子です。 "New label"ボタンを押すと、 "text1"がディスプレイから削除されますが、Popupは存続します。

text1またはそれが含まれているpanelが削除されたときに、私がポップアップを隠すことができるようにする必要があります。実際のremove()メソッドが呼び出された場所にコードを追加しないでください。

答えて

3

あなたはたHierarchyListenerrを使用することができます。

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

関連する問題