2010-12-10 7 views
13

¿Es posible obtener la primera carta en CardLayout de Java? He intentado recorrer cada componente para verificar la visibilidad con isVisible() pero parece que todos son "visibles".Cómo obtener la primera carta en CardLayout de Java

Editar: Por "tarjeta superior" me refiero a la que está actualmente en la "parte superior", que se muestra, no la primera o la última carta. Además, no sé si ayuda, pero estoy buscando un JPanel (o una subclase de los mismos)

Editar: Fragmento de código

for (Component component : getComponents()) { 
if (component instanceof JPanel && component.isVisible()) { 
    currentPanel = (JPanel) component; 
    System.out.println(currentPanel.getClass().getName()); 
} 
} 

El código anterior siempre se imprime el nombre de cada clase de componente, independientemente de si son la tarjeta visible o no.

Editar: Estoy usando esto como parte de una tarea escolar. No estoy tratando de obtener un regalo de promoción aquí, la tarea no gira en torno a este diseño. Simplemente parece ser el diseño más conveniente para cambiar entre paneles. Mi profesor ha especificado que no debe haber código de terceros en el proyecto. He visto la implementación desde el enlace de Camickr antes, pero no puedo usarlo. Puedo implementar funciones similares de forma flexible y tal vez darle una referencia en la documentación, pero no puedo simplemente descargarlo y usarlo.

Editar: La razón por la que trato de obtener la primera carta es porque tengo una barra de herramientas con un botón "Agregar". En lugar de tener un botón para agregar para cada una de mis dos cosas posibles, quería que supiera qué agregar simplemente mirando qué panel se está viendo actualmente. Si hay otra forma más adecuada de hacerlo, házmelo saber.

Editar: Gracias a todos por su ayuda. Me di cuenta de cuál era el problema. Supongo que fue mi culpa ya que no proporcioné suficientes detalles. Dos de mis cartas son JScrollPane sy también necesitaba revisar su contenido para ver si uno de esos paneles era el que estaba viendo. No comprueve el isVisible() en el panel de desplazamiento en sí, lo he estado viendo y afirma que siempre está visible, fue el panel de desplazamiento cuya visibilidad necesitaba verificar.

public JPanel getCurrentPanel() { 
     JPanel currentPanel = null; 

     for (Component component : getComponents()) { 
      if (component.isVisible()) { 
       if (component instanceof JPanel) 
        currentPanel = (JPanel) component; 
       else if (component instanceof JScrollPane) 
        currentPanel = (JPanel) ((JScrollPane) component).getViewport().getComponent(0); 
      } 
     } 

     return currentPanel; 
    } 

Respuesta

11

Si modifica el fragmento de código que agregó a la pregunta, puede saber fácilmente qué tarjeta es visible. En mi marco de prueba, cuando se presiona el botón, se imprime el nombre de la tarjeta actualmente visible, antes de pasar a la siguiente tarjeta. Al modificar su código, lo importante a tener en cuenta es que debe llamar a getComponents() en el componente que realmente tiene CardLayout. De esta forma, solo uno de sus hijos es visible. Supongo que en su código está llamando a getComponents en el marco que contiene su JPanel con CardLayout.

class TestFrame 
     extends JFrame 
     implements ActionListener 
{ 
    public TestFrame() 
    { 
     cards = new JPanel(new CardLayout()); 
     card_list = new JPanel[5]; 

     for (int i = 0; i < card_list.length; i++) { 
      String text = "Card " + i; 
      JPanel card = createCard(text); 
      card_list[i] = card; 
      cards.add(card, text); 
     } 

     add(cards); 
    } 

public JPanel getCurrentCard() 
{ 
    JPanel card = null; 

    for (Component comp : cards.getComponents()) { 
     if (comp.isVisible() == true) { 
      card = (JPanel)comp; 
      System.out.println(card.getName()); 
     } 
    } 
    System.out.println(); 

    return card; 
} 

public void actionPerformed(ActionEvent evt) 
{ 
    JPanel card = getCurrentCard(); 

    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.next(cards); 
} 

    public JPanel createCard(String text) 
    { 
     JPanel card = new JPanel(); 
     card.setName(text); 

     JButton btn = new JButton(text); 
     btn.addActionListener(this); 

     card.add(btn); 
     return card; 
    } 

    JPanel cards; 
    JPanel[] card_list; 
} 

En el método actionPerformed(), me impreso el nombre de la tarjeta, pero usted tiene una referencia a la tarjeta visible en ese momento.

+0

@RD, el fragmento de código proviene de un intento de un método 'getCurrentPanel()' en JPanel que usa CardLayout. He extendido JPanel por otros motivos, así que tengo acceso a él. – alexcoco

+0

Bueno, sin ver todo tu código, no puedo decirte lo que está pasando mal, pero puedo decirte que mi código TestFrame encuentra correctamente solo una tarjeta visible a la vez. –

+0

@alexcoco, editado para poner el código relevante en un método getCurrentCard(). –

0

En la implementación de CardLayout.first() que se supone para ajustar la tarjeta superior visible de tener lo siguiente:

int ncomponents = parent.getComponentCount(); 
for (int i = 0 ; i < ncomponents ; i++) { 
    Component comp = parent.getComponent(i); 
    if (comp.isVisible()) { 
     comp.setVisible(false);  // hide previously visible components 
     break; 
    } 
} 

if (ncomponents > 0) { 
    currentCard = 0; 
    parent.getComponent(0).setVisible(true); // set visibility of component 0 
    parent.validate(); 
} 

así que supongo que se puede controlar la "tarjeta de la parte superior" por yourContainer.getComponent(0).

+0

Lo siento, no quise decir la primera tarjeta. Actualicé la pregunta. – alexcoco

+2

Ahh. Mi error. Parece que deberías poder recorrer los componentes y buscar el elemento 'isVisible' aunque ... ¿estás seguro de que esto no funciona? – aioobe

+0

Sí, recorriendo todos e imprimiendo el valor siempre me deja la última carta aunque la tarjeta visible haya cambiado. Lo actualizaré en un segundo con un fragmento. – alexcoco

2

Amplié el CardLayout para proporcionar este tipo de funcionalidad. Ver Card Layout Focus.

Editar:

Entonces bucle a través de los componentes en busca de la compnent con un ZOrder de 0. Esto es la que está pintado en la parte superior. En realidad, ni siquiera tiene que iterar a través de todos los componentes, simplemente obtenga el componente en la posición 0. Consulte mi blog en el Diseño de superposición para obtener una descripción más detallada de cómo funciona ZOrder.

Component visibleComponent = panelWithCardLayout.getComponent(0); 

Edit2:

El texto de arriba es erróneo. ZOrder no tiene ningún significado cuando se usa con CardLayout. Entonces no puedes simplemente obtener el componente 0.

+0

Sí, he visto esto antes. Pero no puedo hacer eso. Actualizaré la pregunta con una explicación en un segundo. – alexcoco

+0

@alexcoco, mira la edición. – camickr

+0

buscándolo en este momento, gracias – alexcoco

-1

Puede configurar variable que cambia en función de la visibilidad tarjeta

por ejemplo

int cardShow; 

y luego configura su tarjeta visibles

cards.show(card1, "card1"); 
cardShow = 1; 

y cuando se intenta obtener qué tarjeta es visible solo use

if (cardShow == 1) 
//code in case of card1 is visible 
Cuestiones relacionadas