今から始めるプログラミング3
さて前回のプログラムの解説です。
以下のようなクラスを作りました。
SampleFrameクラス
------------------------------------
package sample1;package sample1;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
/** * とりあえず画面を表示するだけならこれだけでOK
* @author matsui yoshikazu
*
*/
public class SampleFrame extends JFrame {
/** * コンストラクタ
* クラス名と同じ名前のメソッドです
*/
public SampleFrame(){
this.setTitle("サンプル");
this.setSize(new Dimension(300,200)); this.getContentPane().add(new JButton("ボタンに見えないけどボ・タ・ン"));
this.setVisible(true);
}
public static void main(String args){
SampleFrame frame = new SampleFrame();
}
}
-------------------------------------
せんせー違うでー。
という声が聞こえそうです。すいません。少し組み替えて遊んでました?
クラスはプロパティとメソッドをもつ、というのは基本として大抵、書籍に書かれていることですが、前回のプログラムも今回のプログラムも、実はちょっと特別です。
どう特別かというと、まずmain(メイン)メソッドというものです。
javaのプロジェクトに参加して、まず成果物(自分の担当作成したプログラム)として作るクラスにmainメソッドは含まれません。
どういうことかというと、基本的にひとつのアプリケーションでmainメソッドはひとつ、もしくは、WEBアプリのコンテナ(サーブレットコンテナやDIコンテナ詳しくは後ほど・・・解説しないかもですが)から呼び出される場合、mainメソッドすらないので、複数メンバーで作る場合、mainメソッドを含むプログラムをいじる機会はありません。
とはいえ、自分だけで作る場合、mainメソッドがないと単体で動かせないので、作成しています。そして、前回のプログラムでは、クラスの中身がmainメソッドしかなく、mainメソッドにプログラムを記述していました。
つぎに、今回のプログラムではコンストラクタというメソッドを使っています。コンストラクタはクラス名と同じ名前で、「戻り値」が設定されていません。
コンストラクタは、オブジェクトがインスタンスかされる時に必ず呼び出されるメソッドで、newというキーワードのあとにクラス名を指定してクラスの型のオブジェクトに代入している箇所で、実行されています。なので、プログラムの初期処理などに利用します。まぁ、init()メソッドなど初期化用のメソッドを作って、コンストラクタからはそのメソッドを呼び出すべき、ともされます。
なので、今回のプログラムでは、mainメソッドではSampleFrameをnewするだけにして、コンストラクタにフレームの初期表示を行うプログラムを記述しました。それにともない、オブジェクトは自分自身になるので、thisというキーワードに置き換えています。
SampleFrameはJFrameなので、JFrameのメソッドをthis.method()という形が成り立つわけです。
とくにJFrameのメソッドをオーバーライドしているわけではないので、superでも同じ動きをします。
こんな感じで、メソッドというものがなんだかふんわりとわかったようなわからないような感じになれば、今回の学習目標はクリアしたも同然です。
というわけで、ボタンに処理を加えます。
Javaの画面処理ではListnerという仕組みで、イベント処理を実現します。汎用的なActionListnerやキーボード入力のKeyListenerというものを実装します。正確にはインターフェースとか、イベント駆動とかいろいろ勉強することはあるのですが、このリスナーを実装すれば、ボタンをおして何かする、というプログラムを作ることができる、ということです。
追加したプログラムです。
-----------------------------------
package sample1;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* とりあえず画面を表示するだけならこれだけでOK
* @author matsui yoshikazu
*
*/
public class SampleFrame extends JFrame implements ActionListener {
/**
* コンストラクタ
* クラスメイト同じ名前のメソッドです
*/
public SampleFrame(){
this.setTitle("サンプル");
this.setSize(new Dimension(300,200));
//ボタンのオブジェクト生成
JButton btn = new JButton("ボタンに見えないけどボ・タ・ン");
//ボタンをリスナーに追加
btn.addActionListener(this);
//ボタンを画面に追加
this.getContentPane().add(btn);
this.setVisible(true);
}
/**
* 実装するメソッド
* @Override
*/
public void actionPerformed(ActionEvent e) {
System.out.println("メソッドが呼ばれました");
}
public static void main(String args){
new SampleFrame();
}
}
-----------------------------------
Listenerはインターフェースなのでimeplementsします。
するとeclipseがメソッドがたりねーみたいなエラーを表示するので、メソッドを追加します。actionPerformed()というのがそれです。actionPerFormedにはボタンが押された場合の挙動を記述します。ここではシステムコンソールに文字列を出力しています。
つぎに、ボタンをリスナーに反応するように変更します。
画面に追加するメソッドでボタンをnewしていましたが、これだとボタンにちょめちょめできないので、手前でボタンのオブジェクトを作ります。そして、リスナーに追加してあげています。
一通りプログラムを記述したら、実行してみましょう。
ボタンを押すとコンソール(eclipseの下の方ですね。レイアウトが違っていたらすいません)に設定した文字列が表示されますでしょうか?
どうでしょう?
ダメな人はプログラムを見直してみましょう。
課題?ではないですが、JFrameを継承したSampleFrameとActionListnerを実装したSampleActionという2つのクラスに分割してつくるというのはどうでしょうか?このコード量でクラス分割もいらないかもしれませんが、役割分担の練習としてはいいかな、と思います。
調べ物をしましょう。
あと、前述のイベント駆動とかインターフェースとか出てきた用語をググってみるのは、最初のノウハウの実践にもなります。検索大好きになりましょう。
次は入力画面と結果画面のあるアプリケーションを作ってみましょう。
最後に、ブースというサービスでとてつもなくくだらないサンプルなどを公開していますので、よろしくお願いします。