Question

Est-il possible d'obtenir la carte en haut CardLayout Java? Je l'ai essayé en boucle à travers chaque composant pour vérifier la visibilité avec isVisible (), mais il semble qu'ils sont tous « visibles ».

Edit: Par « carte top » Je veux dire celui qui est actuellement au « top », affiché, pas la première ou dernières cartes. De plus, je ne sais pas si ça aide, mais je suis à la recherche d'un JPanel (ou une sous-classe de celle-ci)

Edit: Extrait de code

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

Le code ci-dessus imprime toujours le nom de chaque classe de composant, peu importe si elles sont la carte visible ou non.

Modifier : J'utilise cela dans le cadre d'un travail scolaire. Je ne cherche pas à obtenir un billet de faveur ici, l'affectation ne tourne pas autour de cette mise en page. Il semble juste être le plus pratique pour la mise en page de changer entre les panneaux. Mon professeur a précisé qu'il n'y a pas de code pour être un tiers dans le projet. Je l'ai vu la mise en œuvre de lien de camickr avant, mais je ne peux pas l'utiliser. Je peux vaguement implémenter des fonctionnalités similaires et peut-être donner une référence dans la documentation, mais je ne peux pas simplement télécharger et l'utiliser.

Modifier : La raison pour laquelle je suis en train d'obtenir la carte supérieure est parce que j'ai une barre d'outils avec un bouton « Ajouter ». Au lieu d'avoir un bouton d'ajouter pour chacun de mes deux choses possibles que je voulais qu'il sache que d'ajouter simplement en regardant ce panneau est en cours de visualisation. S'il y a une autre façon de faire plus approprié cette s'il vous plaît laissez-moi savoir.

Modifier : Merci à tous pour aider. J'ai compris quel était le problème. Je suppose que c'était ma faute car je n'ai pas fourni suffisamment de détails. Deux de mes cartes sont JScrollPanes et j'ai aussi besoin de regarder à travers son contenu pour savoir si l'un de ces panneaux était celui que je voyais. Je n'ai pas vérifié pour isVisible() dans le volet de défilement lui-même, je cherchais à son soutient que sont toujours visibles, il a été le volet de défilement qui est la visibilité que je devais vérifier.

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;
    }
Était-ce utile?

La solution

Si vous modifiez le code extrait de code vous a ajouté à la question que vous pouvez facilement savoir quelle carte est visible. Dans mon cadre d'essai, lorsque le bouton est enfoncé, il imprime le nom de la carte actuellement visible, avant de se retourner à la carte suivante. La modification de votre code, la chose importante à garder à l'esprit est que vous devez appeler getComponents () sur le composant qui a fait le CardLayout. De cette façon, une seule de ses enfants est visible. Je devine que dans votre code que vous appelez getComponents sur le cadre qui contient vos JPanel avec 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;
}

Dans la méthode actionPerformed (), j'imprimé le nom de la carte, mais vous avez une référence à la carte actuellement visible.

Autres conseils

Je tendis la CardLayout de fournir ce type de fonctionnalité. Voir carte Mise au point Mise en page.

Edit:

boucle ensuite à travers les composants pour la recherche compnent avec un ZOrder de 0. C'est celui qui est peint sur le dessus. En fait, vous n'avez même pas à itérer à travers tous les composants, juste obtenir le composant à la position 0. Vérifiez mon blog sur la mise en page Overlap pour obtenir une description plus détaillée de la façon dont fonctionne ZOrder.

Component visibleComponent = panelWithCardLayout.getComponent(0);

Edit2:

La modification ci-dessus est erroné. ZOrder n'a pas de sens quand il est utilisé avec un CardLayout. Donc, vous ne pouvez pas simplement obtenir le composant 0.

Dans la mise en œuvre de CardLayout.first() qui est censé régler la carte supérieure visible, vous disposez des éléments suivants:

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

donc je suppose que vous pouvez mettre la main sur la « carte du dessus » par yourContainer.getComponent(0).

Vous pouvez définir la variable qui change en fonction de la visibilité de la carte

par exemple

int cardShow;

et puis vous définissez votre carte visible

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

et quand vous essayez d'obtenir la carte qui est visible juste utilisation

if (cardShow == 1)
//code in case of card1 is visible
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top