JPanel, welcher der Listener für die Sichtbarkeit geeignet ist, wurde geändert

Gibt es einige Regeln oder gute / schlechte Erfahrungen mit AncestorListener , ComponentListener oder HierarchyListener , die auf Sichtbarkeit von Änderungen mit JPanel und JComponents ?

Ist einer von ihnen besser oder sicherer als die anderen? Ich möchte insbesondere wissen, wann und wie JPanel / JComponent versteckt ist.

Beachten Sie, dass der folgende Code falsche Swing-Regeln enthält, wie zum Beispiel die Verwendung von Thread.sleep(int) , damit ich die korrekte Reihenfolge von Listeners in der Swing GUI ausdrucken kann

 import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; public class CardlayoutTest extends JFrame { private static final long serialVersionUID = 1L; public CardLayout card = new CardLayout(); public CardlayoutTest() { JPanel pnlA = new JPanel(new BorderLayout()); pnlA.add(new JButton("A"), BorderLayout.CENTER); JPanel pnlB = new JPanel(new BorderLayout()); pnlB.add(new JButton("B"), BorderLayout.CENTER); JPanel pnlC = new JPanel(new BorderLayout()); pnlC.add(new JButton("C"), BorderLayout.CENTER); setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(card); add(pnlA, "A"); add(pnlB, "B"); add(pnlC, "C"); pnlA.addAncestorListener(new EventHandler()); pnlB.addAncestorListener(new EventHandler()); pnlC.addAncestorListener(new EventHandler()); pnlA.addHierarchyListener(new EventHandler()); pnlB.addHierarchyListener(new EventHandler()); pnlB.addHierarchyListener(new EventHandler()); pnlA.addComponentListener(new EventHandler()); pnlB.addComponentListener(new EventHandler()); pnlB.addComponentListener(new EventHandler()); } class EventHandler implements AncestorListener, ComponentListener, HierarchyListener { @Override public void ancestorAdded(AncestorEvent event) { System.out.println("CardlayoutTest.EventHandler.ancestorAdded()"); } @Override public void ancestorMoved(AncestorEvent event) { System.out.println("CardlayoutTest.EventHandler.ancestorMoved()"); } @Override public void ancestorRemoved(AncestorEvent event) { System.out.println("CardlayoutTest.EventHandler.ancestorRemoved()"); } @Override public void hierarchyChanged(HierarchyEvent e) { System.out.println("Components Change: " + e.getChanged()); if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) { if (e.getComponent().isDisplayable()) { System.out.println("Components DISPLAYABILITY_CHANGED : " + e.getChanged()); } else { System.out.println("Components DISPLAYABILITY_CHANGED : " + e.getChanged()); } } if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) { if (e.getComponent().isDisplayable()) { System.out.println("Components SHOWING_CHANGED : " + e.getChanged()); } else { System.out.println("Components SHOWING_CHANGED : " + e.getChanged()); } } } public void componentHidden(ComponentEvent e) { System.out.println(e.getComponent().getClass().getName() + " --- Hidden"); } public void componentMoved(ComponentEvent e) { System.out.println(e.getComponent().getClass().getName() + " --- Moved"); } public void componentResized(ComponentEvent e) { System.out.println(e.getComponent().getClass().getName() + " --- Resized "); } public void componentShown(ComponentEvent e) { System.out.println(e.getComponent().getClass().getName() + " --- Shown"); } } public static void main(String[] args) { CardlayoutTest t = new CardlayoutTest(); t.setSize(500, 500); System.out.println("CardlayoutTest.main()------------------------ FIRST"); t.card.show(t.getContentPane(), "A"); t.setVisible(true); System.out.print("\n"); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("CardlayoutTest.main()------------------------ SECOND"); t.card.show(t.getContentPane(), "B"); System.out.print("\n"); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("CardlayoutTest.main()------------------------ THIRD"); t.card.show(t.getContentPane(), "C"); System.out.print("\n"); } } 

   

Wenn Sie GENAU die Sichtbarkeit ändern möchten, verwenden Sie ComponentListener oder ComponentAdapter :

  JPanel panel = new JPanel (); panel.addComponentListener ( new ComponentAdapter () { public void componentShown ( ComponentEvent e ) { System.out.println ( "Component shown" ); } public void componentHidden ( ComponentEvent e ) { System.out.println ( "Component hidden" ); } } ); 

Aber diese Sichtbarkeit ist vielleicht nicht die, an die du denkst. isVisible() auch dann true , wenn die Component keinem Container hinzugefügt wurde und daher überhaupt nicht isVisible() wird!

Diese Sichtbarkeit hat einen etwas anderen Zweck. Sie können damit die Component , die bereits hinzugefügt wurde und in Ihrer Anwendung angezeigt wird, manuell ausblenden. In diesem Fall (wenn Sie setVisible(false) ) wird es ausgeblendet und jeder ComponentListener dieser Component wird über diese Änderung informiert.

Also, über die tatsächliche Sichtbarkeit sprechen …

Dies ist, was Sie verwenden sollten, um das Aussehen / Verschwinden der tatsächlichen Komponenten zu hören:

  JPanel panel = new JPanel (); panel.addAncestorListener ( new AncestorListener () { public void ancestorAdded ( AncestorEvent event ) { // Component added somewhere } public void ancestorRemoved ( AncestorEvent event ) { // Component removed from container } public void ancestorMoved ( AncestorEvent event ) { // Component container moved } } ); 

Ich benutze immer diesen Listener, um zu bestimmen, wann die Component irgendwo hinzugefügt wurde und um zu hören, wenn sie verschoben / entfernt wird.

Außerdem können Sie jederzeit überprüfen, ob die Component für den Anwendungsbenutzer tatsächlich sichtbar ist, indem isShowing() Methode isShowing() aufrufen:

 boolean userCanSeeThePanel = panel.isShowing(); 

Dies wird NUR dann als true wenn diese Anzeige zu VISIBLE to user frame hinzugefügt wird und isVisible() auch true ist (normalerweise ist es true , es sei denn, Sie setzen es auf false ).

Ich denke, das ist alles, was ich dir über Sichtbarkeit sagen kann. Ich könnte deine Frage missverstanden haben. Korrigiere mich, wenn ich in diesem Fall falsch liege.