Pregunta

¿Es posible obtener la carta superior en CardLayout de Java? He tratado de bucle a través de cada componente para comprobar la visibilidad con isVisible (), pero parece que todos son "visibles".

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

Editar: Código fragmento

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 conseguir un regalo de promoción aquí, la asignación no gira alrededor de este diseño. Sólo parece ser el diseño más conveniente para cambiar entre los paneles. Mi maestro ha determinado que no hay que ser ningún código de terceros en el proyecto. He visto la aplicación de enlace de camickr antes, pero no puedo usarlo. Puedo poner en práctica sin apretar características similares y tal vez dar una referencia en la documentación pero no puedo simplemente descargar y utilizar.

Editar : La razón por la que estoy tratando de conseguir la carta de arriba es porque tengo una barra de herramientas con un botón "Añadir". En lugar de tener un solo botón añadir para cada uno de mis dos cosas posibles que quería para saber qué añadir simplemente observando lo que el panel que se está viendo actualmente. Si hay otra manera, más apropiado para hacer esto, por favor hágamelo saber.

Editar : Gracias a todos por su ayuda. Me di cuenta de cuál era el problema. Creo que fue mi culpa ya que no proporcionan suficiente detalle. Dos de mis tarjetas están JScrollPanes y también que tenía que mirar a través de su contenido para averiguar si uno de esos paneles era el que estaba viendo. Yo no la salida de isVisible() en el panel de desplazamiento en sí, que había estado buscando en él es el sostiene que siempre son visibles, se el panel de desplazamiento que es la visibilidad que necesitaba para 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;
    }
¿Fue útil?

Solución

Si modifica el fragmento de código que añade a la pregunta que usted puede decir fácilmente qué tarjeta es visible. En mi marco de ensayo, cuando se pulsa el botón, se imprime el nombre de la tarjeta visible en ese momento, antes de voltear a la siguiente tarjeta. La modificación de su código, la cosa importante a tener en cuenta es que es necesario llamar a getComponents () en el componente que realmente tiene la CardLayout. De esta manera, sólo uno de sus hijos es visible. Supongo que en el código que está llamando getComponents en el marco que contiene sus 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.

Otros consejos

extendí CardLayout para proporcionar este tipo de funcionalidad. Ver tarjeta de diseño enfoque .

Editar:

Entonces bucle a través de los componentes en busca de la compnent con un ZOrder de 0. Esto es el que está pintado en la parte superior. En realidad no tienen ni siquiera para iterar a través de todos los componentes, acaba de obtener el componente en la posición 0. Visita mi blog sobre los Esquemas de superposición para 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 sentido cuando se utiliza con un CardLayout. Por lo que no puede conseguir simplemente componente 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).

Se puede configurar variable que cambia en función de la visibilidad de tarjetas

por ejemplo

int cardShow;

y luego se establece su carta visible

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

y cuando se intenta obtener la tarjeta, que es el uso apenas visible

if (cardShow == 1)
//code in case of card1 is visible
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top