カードを切り替えて表示する
他のレイアウトマネージャーでは対象の領域に順次コンポーネントが追加されていくのに対して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 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。