13

JavaのCardLayoutで一番上のカードを取得することは可能ですか? isVisible() で可視性をチェックするために各コンポーネントをループしようとしましたが、それらはすべて「可視」のようです。

編集:「トップカード」とは、最初または最後のカードではなく、現在「トップ」に表示されているカードを意味します。また、それが役立つかどうかはわかりませんが、JPanel(またはそのサブクラス)を探しています

編集:コードスニペット

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

上記のコードは、可視カードであるかどうかに関係なく、すべてのコンポーネント クラスの名前を常に出力します。

編集:私はこれを学校の課題の一部として使用しています。私はここで景品を手に入れようとしているわけではありません.課題はこのレイアウトを中心に展開していません. パネルを切り替えるのに最も便利なレイアウトのようです。私の先生は、プロジェクトにサードパーティのコードを入れないように指定しました。以前にcamickrのリンクから実装を見たことがありますが、使用できません。同様の機能を大まかに実装して、ドキュメントで参照することはできますが、単純にダウンロードして使用することはできません。

編集:一番上のカードを取得しようとしている理由は、「追加」ボタンのあるツールバーがあるためです。2 つの可能性のあるものごとに 1 つの追加ボタンを用意する代わりに、現在表示されているパネルを確認するだけで、どれを追加するかを知ることができるようにしたいと考えました。これを行うためのより適切な方法が他にある場合は、お知らせください。

編集:助けてくれてありがとう。私は問題が何であるかを理解しました。十分な詳細を提供しなかったので、それは私のせいだと思います。私のカードの 2 枚はJScrollPanes であり、その内容を調べて、これらのパネルの 1 つが私が見ているものであるかどうかを確認する必要もありました。私はスクロール ペイン自体をチェックしませんでしたisVisible()。常に表示されている競合を調べていました。確認する必要があるのはスクロール ペインでした。

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

4 に答える 4

13

質問に追加したコード スニペットを変更すると、どのカードが表示されているかを簡単に確認できます。私のテスト フレームでは、ボタンが押されると、次のカードにフリップする前に、現在表示されているカードの名前が出力されます。コードを変更する際に留意すべき重要なことは、実際に CardLayout を持つコンポーネントで getComponents() を呼び出す必要があるということです。そうすれば、その子の 1 つだけが表示されます。あなたのコードでは、JPanel with CardLayout を含むフレームで getComponents を呼び出していると思います。

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

actionPerformed() メソッドでカードの名前を出力しましたが、現在表示されているカードへの参照があります。

于 2010-12-10T21:50:11.820 に答える
2

このタイプの機能を提供するために CardLayout を拡張しました。カード レイアウト フォーカスを参照してください。

編集:

次に、コンポーネントをループして、ZOrder が 0 のコンポーネントを探します。これは、一番上にペイントされているコンポーネントです。実際には、すべてのコンポーネントを繰り返し処理する必要さえありません。位置 0 のコンポーネントを取得するだけです。ZOrder の仕組みの詳細については、オーバーラップ レイアウトに関する私のブログを参照してください。

Component visibleComponent = panelWithCardLayout.getComponent(0);

編集2:

上記の編集は間違っています。ZOrder は、CardLayout で使用する場合は意味がありません。したがって、単純にコンポーネント 0 を取得することはできません。

于 2010-12-10T21:08:44.087 に答える
0

一番上のカードを表示するように設定されている実装でCardLayout.first()は、次のようになります。

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

だから、で「トップカード」を手に入れることができると思いますyourContainer.getComponent(0)

于 2010-12-10T21:02:50.727 に答える