Frage

Ist es möglich, die oberste Karte in Java Cardlayout zu bekommen? Ich habe durch jede Komponente versucht Looping mit isVisible für Sichtbarkeit zu überprüfen (), aber es scheint, dass sie alle „sichtbar“ sind.

Edit: Mit „Top-Karte“ Ich habe das eine bedeutet, dass an der „Spitze“ zur Zeit ist, angezeigt wird, nicht die ersten oder letzten Karten. Auch weiß ich nicht, ob es hilft, aber ich bin auf der Suche nach einem JPanel (oder eine Unterklasse davon)

Edit: Code-Schnipsel

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

Der obige Code immer druckt Namen jede Komponentenklasse, unabhängig davon, ob sie die sichtbare Karte sind oder nicht.

Bearbeiten : Ich verwende diese als Teil einer Schulaufgabe. Ich versuche nicht, einen Freebie hier zu bekommen, wird die Zuordnung nicht dieses Layout dreht sich um. Es scheint nur das bequemste Layout zu sein für zwischen den Platten zu verändern. Mein Lehrer hat angegeben, dass es keine dritte Partei Code in dem Projekt. Ich habe die Implementierung von camickr des Link gesehen vor, aber ich kann es nicht verwenden. Ich kann locker implementieren ähnliche Features, die es und vielleicht eine Referenz in der Dokumentation geben, aber ich kann nicht einfach herunterladen und verwenden es.

Bearbeiten : Der Grund, warum ich versuche, die oberste Karte zu bekommen, ist, weil ich eine Symbolleiste mit einer Schaltfläche „Hinzufügen“ habe. Statt mit einer Add-Taste für jede meiner zwei möglichen Dinge, die ich es wollte wissen, was einfach hinzufügen, indem Sie auf welcher Platte zur Zeit betrachtet wird. Wenn es eine andere, geeignetere Weg, dies bitte tun Sie mich bitte.

Bearbeiten : Danke an alle für die Unterstützung aus. Ich fand heraus, was das Problem war. Ich denke, es war meine Schuld, da ich nicht genug Detail vorsah. Zwei meiner Karten sind JScrollPanes und ich auch durch seinen Inhalt suchen benötigt, um herauszufinden, ob eine dieser Platten derjenige war ich sah. Ich habe überprüft nicht für isVisible() auf dem Bildlauffenster selbst, ich gesucht hatte an ihn ist beantragt, sind immer sichtbar, wurde die Bildlauffenster, die die Sichtbarkeit ich brauchte, um zu überprüfen.

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;
    }
War es hilfreich?

Lösung

Wenn Sie den Code ändern Snippet Sie auf die Frage hinzugefügt Sie leicht, welche Karte sichtbar ist, berichten. In meinem Testrahmen, wenn die Taste gedrückt wird, druckt er den Namen der aktuell sichtbaren Karte aus, bevor er zur nächsten Karte Spiegeln. Ändern Sie den Code, die wichtige Sache im Auge zu behalten ist, dass Sie benötigen getComponents () aufzurufen, auf der Komponente, die tatsächlich die Cardlayout hat. Auf diese Weise nur eines ihrer Kinder sichtbar ist. Ich bin in Ihrem Code Erraten Sie getComponents auf dem Rahmen fordern, dass Ihre JPanel mit Cardlayout enthält.

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

In der actionPerformed () -Methode, druckte ich den Namen der Karte, aber Sie haben einen Verweis auf die derzeit sichtbare Karte.

Andere Tipps

erweiterte ich das Cardlayout diese Art von Funktionalität bereitzustellen. Siehe Kartenlayout Fokus .

Edit:

Dann Schleife durch die Komponenten für das compnent mit einem ZOrder von 0. suchen Dies ist das eine, die auf der Oberseite gemalt. Eigentlich haben Sie nicht einmal zu durchlaufen alle Komponenten, nur um die Komponente an Position 0. Sehen meinen Blog auf dem Overlap-Layout für eine detailliertere Beschreibung, wie ZOrder funktioniert.

Component visibleComponent = panelWithCardLayout.getComponent(0);

Edit2:

Das oben gezeigte bearbeiten ist falsch. ZOrder hat keine Bedeutung, wenn sie mit einem Cardlayout verwendet. So können Sie nicht einfach 0 Komponente erhalten.

Bei der Implementierung von CardLayout.first(), die die oberste Karte einstellen soll sichtbar Sie haben die folgende:

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

so nehme ich an Sie halten die „oberste Karte“ von yourContainer.getComponent(0) bekommen kann.

Sie können Variable, die auf der Karte Sichtbarkeit ändert sich in Abhängigkeit

zum Beispiel

int cardShow;

und dann legen Sie Ihre Karte sichtbar

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

und wenn Sie versuchen, die Karte zu bekommen, ist sichtbar nur Gebrauch

if (cardShow == 1)
//code in case of card1 is visible
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top