でか文字表示ツールを作ってみよう4

 

GUIのプログラムは、イベント ドリブン(event driven)と言われるように
「ユーザの操作によって駆動する」ように作ります。
(厳密に言うと、タイマーなどユーザ操作以外の「イベント」もあります。)

毎度、管理人イガジーです。

Javaでは、「何か操作されたら」というのを受け持つのが
Listener(リスナー)というものです。
Listenerを実際に書くには、クラス宣言に implements と Listener名を書きます。
例えば
class SomeClass implements ActionListener {
という感じです。複数のListenerを定義することもできます。
class SomeClass implements ActionListener, ItemListener {
では、実際に昨日のコードにリスナーを追加してみましょう。

class BigFont3 extends Frame implements ActionListener,ItemListener,FocusListener {
と、implementsを追加すると、Eclipseが赤い■にx マークの警告を表示します。
それをクリックすると
import するか、Create(作成)するか、などの選択肢が出るので import をダブルクリックします。
それでも、赤い■にx マークの警告は消えないので、さらにクリックすると
いくつかの選択肢が出るので、Add unimplemented methods を選びます(ダブルクリックします)。
そうすると、実装しなければならないメソッドが自動的に追加されるので
(中身はカラ)そこに、drawChar()を書けばよいのです。

@Override
public void actionPerformed(ActionEvent arg0) { // 昨日追加済み
	drawChar(); // 昨日追加済み
} // 昨日追加済み
@Override
public void itemStateChanged(ItemEvent arg0) {
	drawChar();
}
@Override
public void focusGained(FocusEvent arg0) {
}
@Override
public void focusLost(FocusEvent arg0) {
	drawChar();
}

FocusGainedは、空のままにしておきます。特に何もしなくて良いので。

次に、このメソッドをコンポーネントに追加します。

fsel.addItemListener(this); // フォント選択のChoice
ch.addFocusListener(this); // 表示文字のTextField
sz.addFocusListener(this); // 文字サイズのTextFiled

通常addxxxListenerの引数には、new ClassName()と書きますが
今回、自分自身にimplementsしているので this と書きます。
TextFieldには、ActionListenerとFocusListenerの2つを追加することになります。
全コードは次のようになります。

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;

class BigFont3 extends Frame implements ActionListener,ItemListener,FocusListener {
	private static final long serialVersionUID = 1L;
	final int gbWIDTH=800,gbHEIGHT=400;
	MyCanvas cv;
	Choice fsel=new Choice();
	TextField ch,sz;

	BigFont3() { // constructor
		String [] fontlist={
				"Serif",
				"SansSerif",
				"Monospaced",
				"Meiryo",
				"MS Gothic",
				"MS Mincho",
				"Osaka",
				"VLgothic",
				"IPAGothic",
				"IPAMincho"
			};
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent ev) {
				System.exit(0);
			}
		});
		this.setTitle("でか文字");
		cv=new MyCanvas(gbWIDTH,gbHEIGHT);
		this.add(cv,BorderLayout.CENTER);
		for (int i=0;i<fontlist.length;++i){
			fsel.add(fontlist[i]);
		}
		fsel.addItemListener(this); // 追加
		Panel p0=new Panel();
		p0.add(new Label("文字"));
		ch=new TextField("漢",4);
		ch.addActionListener(this);
		ch.addFocusListener(this); // 追加
		p0.add(ch);
		p0.add(fsel);
		p0.add(new Label("サイズ"));
		sz=new TextField("300",4);
		sz.addActionListener(this);
		sz.addFocusListener(this); // 追加
		p0.add(sz);
		this.add(p0,BorderLayout.NORTH);
		drawChar(); //
		this.setSize(400,440);
		this.setVisible(true);
	}

	int getnum(TextField tf, int def,int min, int max) {
		int r=def;
		try {
			r=Integer.parseInt(tf.getText());
		}catch (Exception e) {
			r=def;
		}
		if (r<min) {
			r=min;
		}else if (r>max) {
			r=max;
		}
		tf.setText(Integer.toString(r));
		return r;
	}

	void drawChar() {
		int fsize=getnum(sz,300,14,340);
		cv.g.setColor(Color.WHITE);
		cv.g.fillRect(0, 0, gbWIDTH, gbHEIGHT);
		cv.g.setFont(new Font(fsel.getSelectedItem(),Font.PLAIN,fsize));
		cv.g.setColor(Color.BLACK);
		cv.g.drawString(ch.getText(), 0, fsize);
		cv.repaint(); //
	}

	public static void main(String[] args) {
		new BigFont3();
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		drawChar();
	}
	@Override
	public void itemStateChanged(ItemEvent arg0) {
		drawChar();
	}
	@Override
	public void focusGained(FocusEvent arg0) {
	}
	@Override
	public void focusLost(FocusEvent arg0) {
		drawChar();
	}
	class MyCanvas extends Canvas {
		private static final long serialVersionUID = 1L;
		BufferedImage bi;
		Graphics g=null;
		MyCanvas(int ww,int hh) {
			bi=new BufferedImage(ww,hh,BufferedImage.TYPE_INT_RGB);
			g=bi.getGraphics();
		}
		@Override
		public void paint(Graphics g0){
			g0.drawImage(bi, 0, 0, null);
		}
	}
}

これで完成です。
ご意見、ご質問、リクエストなどございましたら、メールフォームからご連絡ください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)