カードを切り替えて表示する
他のレイアウトマネージャーでは対象の領域に順次コンポーネントが追加されていくのに対してCardLayoutでは対象の領域には1つのコンポーネントしか配置できません。その代わりコンポーネントを追加した分だけのカードが作成されます。
1度に1枚のカードしか表示されませんので対象の領域には1つのコンポーネントしか表示することはできませんが、カードを切り替えることで表示するコンポーネントを変えることができます。CardLayoutでは表示するカードを切り替えるためのメソッドがいくつか用意されています。
まず先頭のカードを表示する場合です。CardLayoutクラスで用意されている「first」メソッドを使います。
public void first(Container parent)
コンテナの最初のカードに切り替えます。 パラメータ: parent - 配置が行われる親コンテナ
引数にはCardLayoutを設定しているコンテナ(フレームやパネルなど)のオブジェクトを指定します。
実際の使い方は次のようになります。
JPanel p = new JPanel(); CardLayout layout = new CardLayout(); p.setLayout(layout); layout.last(p);
次は最後のカードを表示する場合です。CardLayoutクラスで用意されている「last」メソッドを使います。
public void last(Container parent)
コンテナの最後のカードに切り替えます。 パラメータ: parent - 配置が行われる親コンテナ
引数には「last」メソッドの場合と同じくCardLayoutを設定しているコンテナ(フレームやパネルなど)のオブジェクトを指定します。
また現在のカードに対して次のカードを表示したり前のカードを表示したりする場合です。CardLayoutクラスで用意されている「next」メソッドと「previous」メソッドを使います。
public void next(Container parent)
指定されたコンテナの次のカードに切り替えます。現在表示されているカード が最後のカードである場合、このメソッドはレイアウト内の最初のカードに切 り替えます。 パラメータ: parent - 配置が行われる親コンテナ
public void previous(Container parent)
指定されたコンテナの前のカードに切り替えます。現在表示されているカード が最初のカードである場合、このメソッドはレイアウト内の最後のカードに切 り替えます。 パラメータ: parent - 配置が行われる親コンテナ
引数には今までと同じくCardLayoutを設定しているコンテナ(フレームやパネルなど)のオブジェクトを指定します。また最後のカードが表示されている時に「next」メソッドを使うと先頭のカードが表示されます。同じく最初のカードが表示されている時に「previous」メソッドを使うと最後のカードが表示されます。
サンプルプログラム
では簡単なサンプルを作成して試してみます。
import javax.swing.*;
import java.awt.CardLayout;
import java.awt.BorderLayout;
import java.awt.event.*;
public class CardLayoutTest2 extends JFrame implements ActionListener{
  JPanel cardPanel;
  CardLayout layout;
  public static void main(String[] args){
    CardLayoutTest2 frame = new CardLayoutTest2();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }
  CardLayoutTest2(){
    /* カード1 */
    JPanel card1 = new JPanel();
    card1.add(new JButton("button"));
    /* カード2 */
    JPanel card2 = new JPanel();
    card2.add(new JLabel("label"));
    card2.add(new JTextField("", 10));
    /* カード3 */
    JPanel card3 = new JPanel();
    card3.add(new JCheckBox("checkbox1"));
    card3.add(new JCheckBox("checkbox2"));
    cardPanel = new JPanel();
    layout = new CardLayout();
    cardPanel.setLayout(layout);
    cardPanel.add(card1, "button");
    cardPanel.add(card2, "label");
    cardPanel.add(card3, "checkbox");
    /* カード移動用ボタン */
    JButton firstButton = new JButton("First");
    firstButton.addActionListener(this);
    firstButton.setActionCommand("First");
    JButton prevButton = new JButton("Prev");
    prevButton.addActionListener(this);
    prevButton.setActionCommand("Prev");
    JButton nextButton = new JButton("Next");
    nextButton.addActionListener(this);
    nextButton.setActionCommand("Next");
    JButton lastButton = new JButton("Last");
    lastButton.addActionListener(this);
    lastButton.setActionCommand("Last");
    JPanel btnPanel = new JPanel();
    btnPanel.add(firstButton);
    btnPanel.add(prevButton);
    btnPanel.add(nextButton);
    btnPanel.add(lastButton);
    getContentPane().add(cardPanel, BorderLayout.CENTER);
    getContentPane().add(btnPanel, BorderLayout.PAGE_END);
  }
  public void actionPerformed(ActionEvent e){
    String cmd = e.getActionCommand();
    if (cmd.equals("First")){
      layout.first(cardPanel);
    }else if (cmd.equals("Last")){
      layout.last(cardPanel);
    }else if (cmd.equals("Next")){
      layout.next(cardPanel);
    }else if (cmd.equals("Prev")){
      layout.previous(cardPanel);
    }
  }
}
上記をコンパイルした後で実行すると次のように表示されます。
			
			
今回は各カードとして登録するものをJPanelクラスのオブジェクトにしました。そしてそれぞれのパネルの上に色々なコンポーネントを配置してあります。
それでは「next」ボタンをクリックして下さい。クリックする毎にカードが切り替わって表示されます。
			
			
			
			
今回は3枚のカードしか登録していませんので、3枚目を表示している時に「next」ボタンをクリックすると先頭のカードが表示されます。
			
			
他にも「First」ボタンをクリックすれば先頭のカードが表示され「Last」ボタンをクリックすれば最後のカードが表示されます。また「Prev」ボタンをクリックすれば1つ前のカードが表示されます。
( Written by Tatsuo Ikura )
				著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。