Java Appletの解説

<14.キー・イベント>

キー・イベントの操作の基本を説明したいと思います。

1.KeyListenerイベントリスナークラス

KeyListenerクラスには、keyPressed、keyReleased、keyTypedの3種類の処理があります。
1.<Javaファイル>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class tkey1 extends Applet{
Image imgs;
int px=170,py=170;
Graphics g;
public void init(){
imgs=getImage(getDocumentBase(),"peke4.gif");
requestFocus();
addKeyListener(
new KeyAdapter(){
public void keyPressed(KeyEvent e){
switch (e.getKeyCode()){
case e.VK_NUMPAD1 :px=px-10;py=py+10;break;
case e.VK_NUMPAD2 :py=py+10;break;
case e.VK_NUMPAD3 :px=px+10;py=py+10;break;
case e.VK_NUMPAD4 :px=px-10;break;
case e.VK_NUMPAD6 :px=px+10;break;
case e.VK_NUMPAD7 :px=px-10;py=py-10;break;
case e.VK_NUMPAD8 :py=py-10;break;
case e.VK_NUMPAD9 :px=px+10;py=py-10;break;
}
if (px<=0){px=0;}
if (px>=360){px=360;}
if (py<=0){py=0;}
if (py>=360){py=360;}
repaint();
}
public void keyReleased(KeyEvent e){
switch (e.getKeyCode()){
case e.VK_NUMPAD1 :px=px+30;py=py-30;break;
case e.VK_NUMPAD2 :py=py-30;break;
case e.VK_NUMPAD3 :px=px-30;py=py-30;break;
case e.VK_NUMPAD4 :px=px+30;break;
case e.VK_NUMPAD6 :px=px-30;break;
case e.VK_NUMPAD7 :px=px+30;py=py+30;break;
case e.VK_NUMPAD8 :py=py+30;break;
case e.VK_NUMPAD9 :px=px-30;py=py+30;break;
}
if (px<=0){px=0;}
if (px>=360){px=360;}
if (py<=0){py=0;}
if (py>=360){py=360;}
repaint();
}} ); }
public void paint(Graphics g){
g.drawImage(imgs,px,py,this);
}}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例1.ここをクリックして下さい。なお、NSは、画面をクリックしないと 動かない場合が多いです。(NS4のVerにより異なります)
2.<解説>
1)KeyListenerクラスの処理
この例では、keyPressed、keyReleasedの2種類の処理が使われています。
2)requestFocus();
フォーカスをキー合わせる。キー入力イベントに受け付けるために必要です。
3)keyPressed
キーが押された時におこなわれる処理。
1.e.getKeyCode()
キーコードを取得する。押されたキーのコードが得られます。
2.case e.VK_NUMPAD1
押されたキーコードがテンキーの「1」なら以下を実行する。px=px-10;py=py+10;X座標を10減少 Y座標を10増量した位置に絵を表示する。以下同様です。VK_NUMPAD2は「2」のキーコードです。
4)if (px<=0){px=0;} if (px>=360){px=360;}
if (py<=0){py=0;} if (py>=360){py=360;}
repaint();
これらは、絵がはみ出ないようにする処置です。
5)keyReleased
キーが放された時におこなわれる処理。
case e.VK_NUMPAD1 :px=px+30;py=py-30;
テンキーの「1」のキーが放された時、X軸を30増量、Y軸30減少させて位置に絵を移動する。 大して意味がないのですが、例題のためつけました。押しつづけたキーが放された時 逆方向に少し戻ります。
ゲームでテンキーを使う時は、keyPressedを使って絵など移動させればいいです。

2.KeyListenerイベントリスナークラス(keyTyped)

keyTypedの処理についての例題です。
1.<Javaファイル>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
public class tkey3 extends Applet{
String msg[]=new String[6];
String ink="";
int xcount[]=new int[6];
int gyp,gyp1,ydel,w1;
Graphics g;
Font f;
FontMetrics fm;
Button bt1;
public void init(){
int i;
msg[0]="_";
for (i=1;i<6;i++){msg[i]="";}
setLayout(null);
add(bt1=new Button("clear"));
bt1.setSize(50,20);
bt1.setLocation(170,380);
bt1.addActionListener(new MyListener());
requestFocus();
addKeyListener(
new KeyAdapter(){
public void keyTyped(KeyEvent e){
ink=ink+e.getKeyChar();
w1=fm.stringWidth(ink);
gyp=(int)(w1/360);
msg[gyp]=msg[gyp].substring(0,xcount[gyp]);
if ((gyp-gyp1)==1){msg[gyp-1]=msg[gyp-1].substring(0,xcount[gyp-1]);}
msg[gyp]=msg[gyp]+e.getKeyChar()+"_";
xcount[gyp]=xcount[gyp]+1;
gyp1=gyp;
repaint(); }
public void keyPressed(KeyEvent e){
if (e.getKeyCode()==e.VK_DELETE){int j;
w1=fm.stringWidth(ink);
gyp=(int)(w1/360);
ydel=xcount[gyp]-1;
msg[gyp]=msg[gyp].substring(0,ydel);
xcount[gyp]=xcount[gyp]-1;
ink="";
for (j=0;j<=gyp;j++){ink=ink+msg[j];}
if (xcount[gyp]<0){xcount[gyp]=0;}
repaint();} } } ); }
public void paint(Graphics g){int i;
g.setColor(Color.black);
f=new Font("TimesRoman",Font.BOLD,50);
g.setFont(f);
fm=getFontMetrics(f);
for (i=0;i<6;i++){g.fillRect(0,i*60+70,399,5);
g.drawString(msg[i],20,60*i+60);} }
class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int i;msg[0]="_";xcount[0]=0;
for (i=1;i<6;i++) {msg[i]="";xcount[i]=0;}
ink="";
gyp=0;ydel=0;w1=0;
requestFocus();
repaint(); } }}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例2.ここをクリックして下さい。なお、NSは、画面をクリックしないと 動かない場合が多いです。(NS4のVerにより異なります)
2.<解説>
1)変数の説明
1.String msg[]=new String[6];String ink="";
msg[]は入力された文字を表示するために記憶しておく文字変数です。msg[0]は1行目、 msg[1]は、2行目を記憶するための文字変数です。
inkは、入力された文字すべてを記憶するための文字変数です。行変えすべきか等の 判定に使われます。
2.int xcount[]
各行の文字の数を記憶する変数です。xcount[0]は、1行目の文字の数を記憶する変数です。 「DEL」キーで文字を削除する時などに使います。
3.int gyp,gyp1,ydel,w1;
gypは、求めた行を代入する変数。gyp1は、行変わりしたか比較するための行を記憶する変数。 ydelは、文字削除した時、どこの文字まで表示するか決める変数。w1は、表示された文字 の幅を代入する変数。
4.FontMetrics fm;
FontMetricsクラスは、フォント情報得るクラス。
2)初期値
msg[0]="_";for (i=1;i<6;i++){msg[i]="";}
文字表示は、1行目だけ”_”の文字を表示させますが、他は何も入れません。
3)keyPressed(KeyEvent e){
キーが入力された時の処理です。
1.ink=ink+e.getKeyChar();
e.getKeyChar()は、押されたキーの文字得ることができます。inkに加えることにより inkには、入力された文字がすべて記憶されます。
2.w1=fm.stringWidth(ink);
inkの文字列幅が得られます。
3.gyp=(int)(w1/360);
inkの文字列の幅が360を超えたら行変えをします。そのための計算です。
4.msg[gyp]=msg[gyp].substring(0,xcount[gyp]);
これは、前に表示された”_”を消す処理です。msg[gyp]の文字列の0番目から xcount[gyp]番目の直前までの文字を取り出す。これで、前に表示された”_”が 消えます。”_”は、次に入力される文字の場所を示すためのものです。
5.if ((gyp-gyp1)==1){msg[gyp-1]=msg[gyp-1].substring(0,xcount[gyp-1]);}
行変わりした時、最後に”_”が残るのでこれを消すための処理です。
gyp1は前回の行、gypは今回の行。同じであれば{ }は実行されません。1行増えれば { }は実行されます。
6.msg[gyp]=msg[gyp]+e.getKeyChar()+"_";
入力された文字e.getKeyChar()をmsg[gyp]に追加して最後に”_”を付けます。 7.xcount[gyp]=xcount[gyp]+1;
入力された文字が1つ増えましたのでxcount[gyp]+1で1足します。
8.gyp1=gyp;
行変えをみるため、gyp1に行を代入します。
4)keyPressed(KeyEvent e){
「DEL」キーが押された時、表示されてる文字1字削除します。
1.ydel=xcount[gyp]-1;msg[gyp]=msg[gyp].substring(0,ydel);
文字1字削除しますのでxcount[gyp]-1で文字の数を減らします。 msg[gyp]の文字列を最後の1字を削除した文字列に変えます。
2.xcount[gyp]=xcount[gyp]-1;
文字削除したのでxcount[gyp]も1字減らします。
3.ink="";for (j=0;j<=gyp;j++){ink=ink+msg[j];}
inkの文字列を1字減らした文字列に変えます。
5)class MyListener implements ActionListener{
「clear」ボタンが押された時の処理です。すなわち初期化です。
requestFocus();
これを入れておかないと、「clear」ボタンを押した後、キー入力を受け付けません。



トップページ

趣味のトップページ

娯楽室の各部屋
Aplletの解説へ戻る

Scriptの解説 Scriptのゲーム Appletのゲーム Linuxの部屋 物置部屋