2011-08-16 9 views
6

He estado buscando en la documentación del Swing CardLayout y no parece haber ninguna forma de determinar qué tarjeta se está mostrando actualmente en la clase. Sin embargo, debe haber una forma de preguntarle al diseño qué tarjeta está mostrando actualmente, ¿verdad?CardLayouts: ¿Cómo puedo saber qué tarjeta es visible?

Debido a las limitaciones del proyecto, no puedo simplemente extenderlo y agregar esta funcionalidad a una subclase, por lo que si no existe dicha función, eso significa que estoy atascado rastreando el estado del componente externo al componente (¡puaj!), o hay alguna otra opción enterrada en algún lugar profundo de Swing?

Respuesta

5

De acuerdo con la How to Use CardLayout tutorial,

Conceptualmente, cada componente que utiliza un CardLayout es como una tarjeta de de juego o de cartas coleccionables en una pila, donde sólo la carta superior es visibles en cualquier momento. Se puede elegir la tarjeta que está mostrando en cualquiera de las siguientes maneras:

  • Al pedir la primera o la última carta, en el orden se agrega al contenedor
  • Por hojeando la cubierta hacia atrás o hacia delante
  • al especificar una tarjeta con un nombre específico

intento,

Component visibleComponent = foo.getComponent(0); 

donde foo es el JPanel ejemplo utilizando CardLayout.

Referencia:

+0

Lea detenidamente la pregunta antes de responder: entiendo cómo mostrar una determinada tarjeta, estoy interesado en determinar qué tarjeta se muestra mediante una llamada al componente en sí, en lugar de seguir su estado externamente. –

+0

¿Podrías por favor ser más específico? Después de leer el enlace que proporcionó, ¿no puedo encontrar a qué se refiere? –

+1

@Tom, tenías razón. Leí mal el tutorial, mi culpa. Ver mi edición – mre

2

tutorial básico pueda describirse cómo cambiar intermediarios cards in CardLayout, un montón de ejemplos sobre CardLayout the best are here o here

de enlace que he publicado aquí How to get the top card in Java's CardLayout

o mejor manera

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
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() { 
     EventHandler eventHandle = new EventHandler(); 
     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); 
     pnlA.addAncestorListener(eventHandle); 
     pnlA.addHierarchyListener(eventHandle); 
     pnlB.addAncestorListener(eventHandle); 
     pnlB.addHierarchyListener(eventHandle); 
     setLayout(card); 
     add(pnlA, "A"); 
     add(pnlB, "B"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    class EventHandler implements AncestorListener, 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("CardlayoutTest.EventHandler.hierarchyChanged()"); 
     } 
    } 

    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(), "B"); 
     System.out.print("\n"); 
    } 
} 
+1

Esto no intenta responder a la pregunta. –

3

Parece que no hay una forma directa de saber qué tarjeta está activa. Supongo que es una decisión de diseño, no un error. Usted es responsable de realizar un seguimiento de la tarjeta activa.

Sin embargo, no entiendo muy bien por qué tendrías que hacer un seguimiento de ello. Swing está basado en eventos y prácticamente sabes qué tarjeta está activa cuando obtienes algún evento.

0

La respuesta seleccionada aquí proporciona el primer componente agregado a CardLayout y no creo que eso sea lo que el usuario está pidiendo.Hay una manera simple de encontrar el panel visible por iteración componentes del CardLayout a través de:

for(Component comp : cardPanel.getComponents()) { 
    if (comp.isVisible()) { 
     return (JPanel)comp; 
    } 
} 

Poner esto en un método que devuelve un componente

Component getVisibleCard() { ... } 

le permitiría obtener el componente que está mostrando actualmente .

Cuestiones relacionadas