Domanda

E 'possibile ottenere la prima carta in CardLayout di Java? Ho provato loop attraverso ogni componente per verificare la presenza di visibilità con IsVisible (), ma sembra che siano tutti "visibile".

Modifica: Per "prima carta" intendo quello che è attualmente al "top", visualizzato, non il primo o l'ultimo carte. Inoltre, non so se aiuta, ma io sto cercando un JPanel (o una sottoclasse di essi)

Modifica: Codice frammento

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

Il codice sopra stampa sempre il nome di ogni classe del componente, a prescindere se sono la carta visibile o meno.

Modifica : Sto usando questo come parte di un compito scolastico. Non sto cercando di ottenere un freebie qui, la cessione non ruotano intorno a questo layout. Sembra proprio essere il layout più conveniente per cambiare tra i pannelli. Il mio insegnante ha specificato che ci deve essere nessun codice di terze parti nel progetto. Ho visto l'attuazione di collegamento di camickr prima, ma non posso usarlo. Posso vagamente implementare caratteristiche simili e magari dare un punto di riferimento nella documentazione, ma non posso semplicemente scaricare e utilizzare.

Modifica : La ragione per cui sto cercando di ottenere la prima carta è perché ho una barra degli strumenti con un pulsante "Aggiungi". Invece di avere un pulsante aggiuntivo per ciascuno dei miei due cose possibili che volevo sapere quali aggiungere semplicemente guardando ciò che pannello è attualmente visualizzato. Se c'è un altro modo più appropriato per fare questo per favore fatemelo sapere.

Modifica : Grazie a tutti per dare una mano. Ho capito quale fosse il problema. Credo che fosse colpa mia dal momento che non hanno fornito dettagli sufficienti. Due delle mie carte sono JScrollPanes e ho anche bisogno di guardare attraverso il suo contenuto per scoprire se uno di questi pannelli è stato quello che stavo vedendo. Non ho controllato per isVisible() sul riquadro di scorrimento in sé, mi era stato a guardare è sostiene che sono sempre visibili, è stato il pannello di scorrimento che è visibilità avevo bisogno di verificare.

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;
    }
È stato utile?

Soluzione

Se si modifica il frammento di codice che si aggiunge alla domanda si può facilmente dire quale carta è visibile. Nel mio telaio di prova, quando viene premuto il pulsante, si stampa il nome della scheda attualmente visibile, prima di lanciare per la prossima carta. Modificare il codice, la cosa importante da tenere a mente è che è necessario chiamare getComponents () sul componente che ha effettivamente il CardLayout. In questo modo, uno solo dei suoi figli è visibile. Sto indovinando nel codice che si sta chiamando getComponents sul telaio che contiene i 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;
}

Nel metodo actionPerformed (), ho stampato il nome della scheda, ma è necessario un riferimento alla scheda attualmente visibile.

Altri suggerimenti

ho esteso il CardLayout per fornire questo tipo di funzionalità. Vedere scheda Layout di messa a fuoco .

Modifica:

Poi un ciclo tra i componenti che cercano la compnent con uno ZOrder 0. Questo è quello che è dipinto sulla parte superiore. In realtà non hanno nemmeno bisogno di scorrere tutti i componenti, basta avere il componente in posizione 0. controllare il mio blog sul layout di sovrapposizione per una descrizione più dettagliata di come funziona ZOrder.

Component visibleComponent = panelWithCardLayout.getComponent(0);

Edit2:

È possibile che questo modifica è sbagliato. ZOrder non ha alcun significato se utilizzato con un CardLayout. Quindi non si può ottenere semplicemente componente 0.

Per l'attuazione del CardLayout.first() che dovrebbe impostare la prima carta visibile si ha la seguente:

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();
}

quindi suppongo che si può entrare in possesso della "carta superiore" di yourContainer.getComponent(0).

E 'possibile impostare la variabile che cambia a seconda della visibilità carta

per esempio

int cardShow;

e poi si imposta la carta visibile

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

e quando si tenta di ottenere quale carta è l'uso appena visibile

if (cardShow == 1)
//code in case of card1 is visible
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top