↓↓クリックして頂けると励みになります。
【39 | JButtonとJLabel】 << 【ホーム】 >> 【41 | Swingメニュー】
Javaでトグルボタンを使用する方法は、Swingを使ってGUIアプリケーションを作成することで実現できます。
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingToggle1.java】
/** *JToggleButtonを表示する。 */ import javax.swing.*; public class SwingToggle1 { private JToggleButton button1, button2; /**コンストラクタ*/ public SwingToggle1(){ //イメージの生成 ImageIcon icon = new ImageIcon("char0.gif"); //ボタンの生成 button1 = new JToggleButton("Button1", icon); button2 = new JToggleButton("Button2", true); } /**main()*/ public static void main(String[] args) { SwingToggle1 toggle = new SwingToggle1(); JFrame frame = new JFrame("Toggle1"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.getContentPane().add(toggle.button1, "West"); frame.getContentPane().add(toggle.button2, "East"); frame.pack(); frame.setVisible(true); } }
なおこのプログラムを実行するには以下の「char0.gif」が必要ですので、プログラムを作成するフォルダに保存しておいてください。
[char0.gif]
トグルボタンとは「選択」「選択解除」の2つの状態をもつボタンです。
SwlngではJToggleButtonで使用します。
JToggleButtonはJCheckBox(チェックボックス)とJRadioButton(ラジオボタン)の基本クラス(親クラス)にあたりますが、JToggleButtonとして使用することも可能です。
JToggleButtonの親クラスはJButtonと同じAbstractButtonですので、JButtonと同様にボタンにテキストやアイコン(あるいはその両方)を表示させることができます。
生成例をあげておきます。
JToggleButtonの初期設定は「選択解除」状態です。
最初から「選択」状態にするには、Button4のように生成時に「true」を加えてください。
JToggleButton button1 = new JToggleButton("これはボタンです"); ImageIcon icon = new ImageIcon("sample.gif"); JToggleButton button2 = new JToggleButton(icon); JToggleButton button3 = new JToggleButton("これはボタンです", icon); JToggleButton button4 = new JToggleButton("これはボタンです", true);
また生成した後にボタンの「選択」「選択解除」状態を変更するには、AbstractButtonで定義されている「setSelected()
」メソッドを用いてください。
JToggleButton button1 = new JToggleButton("これはボタンです"); button1.setSelected(true); // 「選択」状態にする。falseだと「選択解除」
作成したプログラムを実行して動作を確認します。
イラスト付のボタンとイラスト無しのボタンが表示され、クリックすると選択状態と選択解除状態に切り替わります。
~/Desktop/Programming/JP $ javac SwingToggle1.java ~/Desktop/Programming/JP $ java SwingToggle1
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingToggle2.java】
/* *JToggleButtonをグループ化する */ import javax.swing.*; public class SwingToggle2 { private JToggleButton button1, button2; /**コンストラクタ*/ public SwingToggle2() { //イメージの生成 ImageIcon icon = new ImageIcon("char0.gif"); //ボタンの生成 button1 = new JToggleButton("Button1", icon); button2 = new JToggleButton("Button2",true); //ボタングループの生成 ButtonGroup group = new ButtonGroup(); //ボタングループにボタンを登録 group.add(button1); group.add (button2); } /**main()*/ public static void main(String[] args) { SwingToggle2 toggle = new SwingToggle2(); JFrame frame = new JFrame("Toggle2"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.getContentPane().add(toggle.button1, "West"); frame.getContentPane().add(toggle.button2, "East"); frame.pack(); frame.setVisible(true); } }
このプログラムを実行するには以下の「char0.gif」が必要ですので、プログラムを作成するフォルダに保存しておいてください。
[char0.gif]
JToggleButtonは、それぞれについて「選択」「選択解除」になりますが、ポタングループに登録することで、グループ内のどれかひとつだけが選択可能(相互排他的な選択処理)になります。
ボタングループはjavax.swing.ButtonGroup
を利用します。
JToggleButton button1 = new JToggleButton("ボタン1"); JToggleButton button2 = new JToggleButton("ボタン2", true); ButtonGroup group = new ButtonGroup(); group.add(button1); group.add(button2);
この時、ボタングループに登録されたボタンがすべて「選択解除」状態なら表示もそのようにされ、どれかのボタンが選ばれてから相互排他的な選択処理になります。
すべてのボタンが「選択」状態なら、一番先に「選択」状態に設定されたボタンのみが「選択」状態となります。
作成したプログラムを実行して動作を確認します。
イラスト付のボタンとイラスト無しのボタンが表示され、クリックすると選択状態と選択解除状態に切り替わります。
ただしグループ化されているので両方とも選択状態には出来ません。
~/Desktop/Programming/JP $ javac SwingToggle1.java ~/Desktop/Programming/JP $ java SwingToggle1
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingToggle3.java】
/** *JToggleのイベント処理 */ import java.awt.event.*; import javax.swing.*; public class SwingToggle3 implements ItemListener { private JToggleButton button1, button2; private JFrame frame; /**コンストラクタ*/ public SwingToggle3() { //フレームの生成 frame = new JFrame("Toggle3"); //ボタンの生成 button1 = new JToggleButton("deselected"); button2 = new JToggleButton("Selected",true); //イベントへの通知を登録 button1.addItemListener(this); button2.addItemListener(this); } /**ボタンでイベントが発生した時の処理*/ public void itemStateChanged(ItemEvent evt) { //ボタンの状態を取得 int state = evt.getStateChange(); String s; if(state == ItemEvent.SELECTED) { s="Selected"; } else { s="Deselectes"; } //押されたボタンを取得して、ボタンのテキストを変更 Object obj = evt.getItem(); if (obj.equals(button1)) { button1.setText(s); } else { button2.setText(s); } //フレーム以下のコンポーネントを再配置 frame.validate(); frame.pack(); } /**main()*/ public static void main(String[] args) { SwingToggle3 toggle = new SwingToggle3(); toggle.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); toggle.frame.getContentPane().add(toggle.button1, "West"); toggle.frame.getContentPane().add(toggle.button2, "East"); toggle.frame.pack(); toggle.frame.setVisible(true); } }
JToggleButtonもJButtonと同様に、前のセクションで使用したjava.awt.event.ActionListener
でアクション・コマンドを取得する方法が使えます。
またjava.awt.event.*
パッケージに含まれる、ItemListenerインタフェー・スとItemEventクラスを用いる方法もあります。
この場合実装するメソッドは「itemStateChanged()
」となります。
その際ItemEventから取得できる情報は「イベントソース(ItemSelectable)、イベントID(int)、アイテム(object)、変更された状態(int)」になります。
「変更された状態(int)」は「getStateChange()
」メソッドで知ることができ「ItemEvent.SELECTED」「ItemEvent.DESELECTED」であらわされるので、この状態を参照することでボタンの状態を確認することができます。
/**ボタンでイベントが発生したときの処理*/ public void itemStateChanged(ItemEvent evt) { // 押されたボタンの状態を取得 int state = evt.getStateChange(); if(state == ItemEvent.SELECTED) { System.out.println("選択"); } else { System.out.println("選択解除"); } }
この他にも押されたアイテム(この場合トグルボタン)を取得する「getItem()
」メソッドなどがあります。
コンポーネント以下を再配置するにはvalidate()
を使用します。
JFrame frame = new JFrame(); JLabel label = new JLabel("ラベル"); frame.getContentPane().add(label, "Center"); frame.validate(); // frameに配置されているコンポーネント(ラベル)を再配置
作成したプログラムを実行して動作を確認します。
イラスト付のボタンとイラスト無しのボタンが表示され、クリックすると選択状態(selected)と選択解除状態(deselected)に切り替わります。
~/Desktop/Programming/JP $ javac SwingToggle3.java ~/Desktop/Programming/JP $ java SwingToggle3
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingDraw2.java】
/** *JPanelにJCheckBoxとJRadioButtonを利用して図形を描画する */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SwingDraw2 extends JPanel implements ActionListener { private final int WIDTH = 400; //JPanelの幅と高さを定義 private final int HEIGHT = 200; private JPanel panel; private JLabel figLabel, paintLabel; private JCheckBox cbOval, cbRect; private JRadioButton rbDraw, rbFill; private JButton button; /**コンストラクタ*/ public SwingDraw2() { //描画パネルの大きさを設定 setPreferredSize(new Dimension(WIDTH, HEIGHT)); //チェックボックス、ラジオボタンを置くパネルの生成 panel = new JPanel(); //チェックボックスの説明ラベルを生成 figLabel = new JLabel("Zukei"); //チェックボックスを生成 cbOval = new JCheckBox("Oval", true); cbRect = new JCheckBox("Rect"); cbRect.setSelected(true); //後で「選択」状態にする例 //ラジオボタンの説明ラベルを生成 paintLabel = new JLabel("Paint:"); //ラジオボタンを生成 rbDraw = new JRadioButton("Draw", false); rbFill = new JRadioButton("Fill", true); //ボタングループの生成 ButtonGroup group = new ButtonGroup(); //ラジオボタンをボタングループへ登録 group.add(rbDraw); group.add(rbFill); //パネルにラベルと各種ボタンを貼り付け panel.add(figLabel); panel.add(cbOval); panel.add(cbRect); panel.add(paintLabel); panel.add(rbDraw); panel.add(rbFill); //ボタンの生成 button = new JButton("Draw!!"); //イベントの登録(ボタンのみ) button.addActionListener(this); } /**グラフィックス描画処理*/ public void paintComponent(Graphics g) { //コンポーネント全体を白で描画 g.setColor(Color.white); g.fillRect(0,0,WIDTH, HEIGHT); //図形の描画 g.setColor(Color.red); //チェックボックスやラジオボタンの状態を調べて描画 if(cbOval.isSelected() == true) { if(rbFill.isSelected() == true) { g.fillOval((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)),50, 50); } else { g.drawOval((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT)),50,50); } } g.setColor(Color.green); //チェックボックスやラジオボタンの状態を調べて描画 if(cbRect.isSelected() == true) { if (rbFill.isSelected() == true) { g.fillRect((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)), 50, 50); } else { g.drawRect((int)(Math.random()*(WIDTH-50)),(int)(Math.random()*(HEIGHT-50)), 50, 50); } } } /**ボタンでイベントが発生した時の処理*/ public void actionPerformed(ActionEvent evt) { //発生したイベント情報からアクション・コマンドを用いて、 //「発生したコンポーネント」を調べて再描画 //(ボタンしかイベント登録されてないので、無くても良い) String str = evt.getActionCommand(); if(str.equals("Draw!!")) { repaint(); } } /**main()*/ public static void main(String[] args) { SwingDraw2 draw = new SwingDraw2(); JFrame frame = new JFrame("SwingDraw2"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.getContentPane().add(draw.panel, "North"); frame.getContentPane().add(draw.button, "Center"); frame.getContentPane().add(draw, "South"); frame.pack(); frame.setVisible(true); } }
チェックボックスはJCheckBoxを使用します。
チェックボックスはテキストを表示して「選択」「選択解除」状態を視覚的に示すのが一般的です。
JCheckBoxはJToggleButtonを親クラスとしていますので、その機能を使用することができます。
チェックボックスはグループで表示されることが多いですが、普通は相互排他的な処理はしません。
JCheckBox cb1 = new JCheckBox("チェック1"); ImageIcon icon = new ImageIcon("sample.gif"); JCheckBox cb2 = new JCheckBox(icon, true); JCheckBox cb3 = new JCheckBox("チェック3", icon);
JCheckBoxも「setSelected()」を用いて、後で状態を変更することが可能です。
イベント処理も先に述べたようにJToggleButtonと同様に行えます。
AbstractButtonで定義されている「isSelected()
」メソッドを使用することで、「選択」「選択解除」状態を知ることもできます。
ラジオボタンはJRadioButtonを使用します。
ラジオボタンは通常は相互排他的な処理をしますので、ボタングループに登録する必要があります。
JRadioButtonもJToggleButtonを親クラスとしていますので、その機能を使用することができます。
【ラジオボタンの生成例】
JRadioButton rb1 = new JRadioButton("ラジオボタン1"); ImageIcon icon = new ImageIcon("sample.gif"); JRadioButton rb2 = new JRadioButton(icon, true); JRadioButton rb3 = new JRadioButton("ラジオボタン3", icon); ButtonGroup group = new ButtonGroup(); group.add(rb1); group.add(rb2); group.add(rb3);
JRadioButtonも「setSelected()
」を用いて、後で状態を変更することが可能です。
イベント処理も先に述べたようにJToggleButtonと同様に行えます。
JCheckBoxと同様にAbstractButtonで定義されている「isSelected()
」メソッドを使用することで、「選択」「選択解除」状態を知ることもできます。
作成したプログラムを実行して動作を確認します。
図形の形と色を塗りつぶすかどうかを選択して「Draw!」ボタンを押すとキャンバスにランダムな位置に選択した図形が表示されます。
~/Desktop/Programming/JP $ javac SwingDraw2.java ~/Desktop/Programming/JP $ java SwingDraw2
【39 | JButtonとJLabel】 << 【ホーム】 >> 【41 | Swingメニュー】
↓↓クリックして頂けると励みになります。