3

必要な場合にのみカードを追加する CardLayout があります。そのため、特定のカード (名前で識別) を表示する必要が生じた場合、その名前のカードが既に存在するかどうかを確認して、それに応じて表示または作成できるようにする必要があります。

CardLayoutのドキュメントによると

addLayoutComponent を使用して、指定された名前でこのレイアウトに追加されたコンポーネントにフリップします。そのようなコンポーネントが存在しない場合、何も起こりません。

したがって、まだ追加されていないカードを表示するように要求しても、エラーはスローされません。カードが存在するかどうかを確認できる API が見つかりませんでした。

それで、これは可能ですか?そうでない場合、これにどのように対処しますか?追加したカードを手動で覚えるという解決策がありますが、swing でこれを処理できるはずです。

4

2 に答える 2

5

CardLayoutAPIは、コンポーネントが特定の名前ですでに追加されているかどうかを確認する方法を提供しません。

本当にそれを実行したい場合(ただし、実行しないことを強くお勧めます)、コンテナーによって使用されるリフレクションを使用してそのフィールドを読み取り、(タイプの)各エントリーで指定された名前を確認できます。ご覧のとおり、これはハックのように見え、いつかリファクタリングされた場合は機能しなくなる可能性があります(現在の実装はかなり醜いです)。CardLayoutvectorCardLayout$CardCardLayout

Set<String>最善の方法は、どこかのフィールドに追加されたすべての子の名前を直接追跡することです。そして、これはとにかくそれをするのに本当に大したことではありません。

于 2011-05-18T08:24:24.340 に答える
4

そのため、特定のカード(名前で識別される)を表示する必要が生じた場合、その名前のカードがすでに存在するかどうかを確認して、それに応じて表示または作成できるようにする方法が必要です。

  1. コンテナに表示されている現在のコンポーネントを取得します
  2. 別のカードを表示してみてください
  3. コンテナに表示されているコンポーネントを取得します
  4. 2つのコンポーネントが同じである場合、何も起こらず、カードを作成してコンテナに追加する必要があります。

このアプローチにより、カードのセットを自分で管理する手間が省けます。

編集:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardLayoutTest implements ActionListener
{
    JPanel cards;

    public void addComponentToPane(Container pane) {
        JPanel comboBoxPane = new JPanel();
        String comboBoxItems[] = { "Red", "Orange", "Green", "Yellow", "Blue"};
        JComboBox cb = new JComboBox(comboBoxItems);
        cb.setEditable(false);
        cb.addActionListener(this);
        comboBoxPane.add(cb);

        cards = new JPanel(new CardLayout());

        pane.add(comboBoxPane, BorderLayout.PAGE_START);
        pane.add(cards, BorderLayout.CENTER);

        JPanel red = new JPanel();
        red.setBackground(Color.RED);
        red.setPreferredSize( new Dimension(200, 50) );
        cards.add(red, "Red");

        JPanel green = new JPanel();
        green.setBackground(Color.GREEN);
        green.setPreferredSize( new Dimension(200, 50) );
        cards.add(green, "Green");

        JPanel blue = new JPanel();
        blue.setBackground(Color.BLUE);
        blue.setPreferredSize( new Dimension(200, 50) );
        cards.add(blue, "Blue");
    }

    public void actionPerformed(ActionEvent e)
    {
        Component visible = getVisibleCard();

        JComboBox comboBox = (JComboBox)e.getSource();
        String item = comboBox.getSelectedItem().toString();
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, item);

        //  change code below to create and show your card.

        if (visible == getVisibleCard())
            JOptionPane.showMessageDialog(cards, "Card (" + item + ") not found");

    }

    private Component getVisibleCard()
    {
        for(Component c: cards.getComponents())
        {
            if (c.isVisible())
                return c;
        }

        return null;
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("CardLayoutTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        CardLayoutTest demo = new CardLayoutTest();
        demo.addComponentToPane(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
于 2011-05-18T15:19:13.893 に答える