●ボタンを押すと何かをするようにプログラムを組みます。いままでのプログラムはmainから始めて書かれた順に処理が進みましたが「ボタンを押したら」となるとそうはいきません。このような場合のマウスのクリックやキーボードの入力などを「イベント」といい、このようなプログラムのつくりを「イベントドリブン」(イベント駆動型)といいます。
●前回のプログラムをクリックを認識するように作りかえます。(JButtonの機能としてクリックするとへこんではいました)
/** * ボタンのイベントを */ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class EventTest extends JFrame{ /* コンストラクタ */ public EventTest(){ setSize(400, 300); //サイズ指定 setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理 MyJPanel panel01 = new MyJPanel(); //パネルをつくる Container cn = getContentPane(); //コンテナ取得 cn.add(panel01); //パネルを貼る setVisible(true); //表示する } /********* main **********/ public static void main(String[] args){ /* フレームを作成(事実上のプログラム実行) */ EventTest frame1 = new EventTest(); } /* パネルを作るクラス */ public class MyJPanel extends JPanel implements ActionListener { JButton button; JLabel label; int count = 0; /* コンストラクタ */ public MyJPanel(){ //パネルに色を指定 setBackground(new Color(240,255,255)); //ボタンを作る button = new JButton("Click Me!"); //ラベルを作る label = new JLabel("clicks",JLabel.CENTER); //レイアウトマネージャを指定 setLayout(new BorderLayout()); //ラベルを真ん中に add(label, BorderLayout.CENTER); //ボタンを下に配置 add(button, BorderLayout.SOUTH); //ボタンにイベントの監視人をつける button.addActionListener(this); } /* イベントがあったらここに来る */ public void actionPerformed(ActionEvent e) { //イベントがbuttonで起こっていたら… if (e.getSource() == button) { //countを増加 count++; //ラベルの文字を換える。 label.setText(count + " clicks"); } } } }
●ボタンを押すとクリックの回数表示が増えていきます。
●このパッケージの部品を使います。書いておくことで短い名前で呼び出せます。
import java.awt.event.*;
●JPanelを拡張するだけでなく、イベント処理のActionListener の道具を使えるようにします。
public class MyJPanel extends JPanel implements ActionListener {
●button, label などのオブジェクトは、MyJPanelのコンストラクタだけでなく、actionPerformed のメソッドでも使うので、ここで宣言しておきます。ブロックの中で宣言した変数やオブジェクトはそのブロックないでしか使うことができません。
JButton button; JLabel label; int count = 0;
●count はクリックの回数を入れておくための整数型の変数です。
●buttonという名前のボタンに、クリックされたことを見張る監視人をつけます。クリックを感知したら this を実行します。この this は自分自身のクラス(から作られたオブジェクト)を指します。
●つまりここでは MyJPanel からつくられたオブジェクト panel01 です。このコンストラクタから作られるオブジェクトはさまざまな名前がつけられます。ここで、this とすればオブジェクトを作成した時点でそのオブジェクトのことをさすようになります。
button.addActionListener(this);
●「クリックを感知したら this を実行します。」と書きましたが正確には、MyJPanelのオブジェクトpanel01 のactionPerformedというメソッドが実行されます。したがって、MyJPanelには、actionPerformedという部分がなければなりません。
/* イベントがあったらここに来る */ public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { //イベントがbuttonで起こっていたら… count++; //countを増加 label.setText(count + " clicks"); //ラベルの文字を換える。 } }
●どんなイベントが起こったかもオブジェクトに入れて知らされます。それが、ActionEvent e です。ActionEventクラスの eという名前のオブジェクトです。(正確にはわたされるオブジェクトに、e と名前をつけたのです)
●e.getSource() で、イベントの発生がどこで起こったか調べます。これが button であれば、カウントを増やして、ラベルに表示しています。