カードを切り替えて表示する

広告

他のレイアウトマネージャーでは対象の領域に順次コンポーネントが追加されていくのに対してCardLayoutでは対象の領域には1つのコンポーネントしか配置できません。その代わりコンポーネントを追加した分だけのカードが作成されます。

1度に1枚のカードしか表示されませんので対象の領域には1つのコンポーネントしか表示することはできませんが、カードを切り替えることで表示するコンポーネントを変えることができます。CardLayoutでは表示するカードを切り替えるためのメソッドがいくつか用意されています。

まず先頭のカードを表示する場合です。CardLayoutクラスで用意されている「first」メソッドを使います。

コンテナの最初のカードに切り替えます。

パラメータ:
  parent - 配置が行われる親コンテナ

引数にはCardLayoutを設定しているコンテナ(フレームやパネルなど)のオブジェクトを指定します。

実際の使い方は次のようになります。

JPanel p = new JPanel();
CardLayout layout = new CardLayout();
p.setLayout(layout);

layout.last(p);

次は最後のカードを表示する場合です。CardLayoutクラスで用意されている「last」メソッドを使います。

コンテナの最後のカードに切り替えます。

パラメータ:
  parent - 配置が行われる親コンテナ

引数には「last」メソッドの場合と同じくCardLayoutを設定しているコンテナ(フレームやパネルなど)のオブジェクトを指定します。

また現在のカードに対して次のカードを表示したり前のカードを表示したりする場合です。CardLayoutクラスで用意されている「next」メソッドと「previous」メソッドを使います。

指定されたコンテナの次のカードに切り替えます。現在表示されているカード
が最後のカードである場合、このメソッドはレイアウト内の最初のカードに切
り替えます。

パラメータ:
  parent - 配置が行われる親コンテナ
指定されたコンテナの前のカードに切り替えます。現在表示されているカード
が最初のカードである場合、このメソッドはレイアウト内の最後のカードに切
り替えます。

パラメータ:
  parent - 配置が行われる親コンテナ

引数には今までと同じくCardLayoutを設定しているコンテナ(フレームやパネルなど)のオブジェクトを指定します。また最後のカードが表示されている時に「next」メソッドを使うと先頭のカードが表示されます。同じく最初のカードが表示されている時に「previous」メソッドを使うと最後のカードが表示されます。

サンプルプログラム

では簡単なサンプルを作成して試してみます。

CardLayoutTest2.java

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

上記をコンパイルした後で実行すると次のように表示されます。

CardLayoutでカードを切り替える

今回は各カードとして登録するものをJPanelクラスのオブジェクトにしました。そしてそれぞれのパネルの上に色々なコンポーネントを配置してあります。

それでは「next」ボタンをクリックして下さい。クリックする毎にカードが切り替わって表示されます。

CardLayoutでカードを切り替える

CardLayoutでカードを切り替える

今回は3枚のカードしか登録していませんので、3枚目を表示している時に「next」ボタンをクリックすると先頭のカードが表示されます。

CardLayoutでカードを切り替える

他にも「First」ボタンをクリックすれば先頭のカードが表示され「Last」ボタンをクリックすれば最後のカードが表示されます。また「Prev」ボタンをクリックすれば1つ前のカードが表示されます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)