でか文字表示ツールを作ってみよう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);
}
}
}
これで完成です。
ご意見、ご質問、リクエストなどございましたら、メールフォームからご連絡ください。
この記事へのコメントはこちら