Swing の CardLayout

カードレイアウト カードレイアウト カードレイアウト

CardLayout (カードレイアウト) では、タブのようにコンテナ内に表示されているものを一式丸ごと切り替えることができます。

上のスクリーンショットの例では、はじめは "ABC" と "XYZ" という文字が書かれている二つのボタンが表示されています。 それが "Card1" の内容です。上部のコンボボックスで "Card2" という文字を選んだことをきっかけにして、 下部を "Card2" の内容に切り替えています。"Card2" の内容はテキストフィールド一個だけです。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class LayoutTestCard1 extends JFrame implements ItemListener {

  JPanel cardPanel;
  
  public LayoutTestCard1(){
    
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(200,150);

    Container contentPane = getContentPane();
    
    //カードレイアウトで切り替える部分
    cardPanel = new JPanel();
    cardPanel.setLayout(new CardLayout());

    JPanel card1 = new JPanel();
    card1.add(new JButton("ABC"));
    card1.add(new JButton("XYZ"));
    
    JPanel card2 = new JPanel();
    card2.add(new JTextField("Test field on Card2"));

    cardPanel.add(card1, "Card1");
    cardPanel.add(card2, "Card2");
    
    //コンボボックスを配置する部分
    JPanel topPanel = new JPanel();
    
    String comboboxStrings[] "Card1""Card2" };
    JComboBox comboBox = new JComboBox(comboboxStrings);
    comboBox.addItemListener(this);
    
    topPanel.add(comboBox);
    
    //コンテントペインにパネルを追加
    contentPane.add(topPanel, BorderLayout.NORTH);
    contentPane.add(cardPanel, BorderLayout.CENTER);
  }
  
  public static void main(String[] args) {    
    SwingUtilities.invokeLater(new Runnable(){
      public void run(){
        createAndShowGUI();
      }
    });
  }

  protected static void createAndShowGUI() {
    LayoutTestCard1 frame = new LayoutTestCard1();
    frame.setVisible(true);
  }

  @Override
  public void itemStateChanged(ItemEvent e) {
    CardLayout cl = (CardLayout)(cardPanel.getLayout());
      cl.show(cardPanel, (String)e.getItem());    
  }

}

上の実装方法を大まかに説明します。

カードレイアウトに設定する JPanel 型のパネルを用意します。setLayout メソッドで CardLayout に切り替えています。

次に二つの "カード" となる JPanel 型の card1、card2 を、 それぞれのカード上に含まれるコンポーネントを追加します。

card1、card2 を CardLayout に設定したパネルに追加します。 このときにそれぞれのカードの名前を割り当てます。

コンボボックスの切り替えイベント処理部にて、カードレイアウトオブジェクトの show メソッドで、 表示させたいカードの名前を指定します。

これによって、目的のカードが表示されるようになります。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門