Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

キー入力のイベント処理がされないことについて

java学習者で、高橋麻奈先生の著書「やさしいJava活用
編」にてjavaを学習しております。

早速ですが、コードを載せます。(前述の本のLesson3の
Sample7.javaのコードです。)
----------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Sample7 extends JApplet
{
 private JLabel lb1, lb2;
 
 public void init()
 {
  //コンテンツペインの取得
  Container cnt = getContentPane();
  
  //コンポーネントの作成
  lb1 = new JLabel("矢印キーでお選びください");
  lb2 = new JLabel();
  
  //コンテナへの追加
  cnt.add(lb1, BorderLayout.NORTH);
  cnt.add(lb2, BorderLayout.SOUTH);
  
  //リスナの登録
  addKeyListener(new SampleKeyListener());
 }
 //リスナクラス
 class SampleKeyListener extends KeyAdapter
 {
  public void keyPressed(KeyEvent e)
  {
   String str;
   int k = e.getKeyCode();
   switch(k)
   {
    case KeyEvent.VK_UP:
     str = "上";
     break;
    case KeyEvent.VK_DOWN:
     str = "下";
     break;
    case KeyEvent.VK_LEFT:
     str = "左";
     break;
    case KeyEvent.VK_RIGHT:
     str = "右";
     break;
    default:
     str = "他のキー";
   }
   lb2.setText(str + "ですね。");
  }
 }
}
---------------------------------------------
実行結果としては
アプレット上部に「矢印キーでお選びください」と表示さ
れ、アプレット下部に↑キーで「上ですね。」↓キーで
「下ですね。」←キーで「左ですね。」→キーで「右です
ね。」と表示される仕様です。
しかし、私が実行した結果、アプレット下部の表示が出ま
せんでした。
コンパイルエラーや実行時のエラーは出ません。通常通り
の実行はされます。

とりあえず以下の解決策を講じましたが、何が原因かはつ
き止められません。
・本のサンプルコードと見比べる
  完全に一致しており、間違いはありませんでした。
  (何度も確認しましたが)
・コード中の「lb2 = new JLabel();」を「lb2 = new
 JLabel("上");」と修正した
  下部に「上」と表示されました。コンテナの追加ま
  で誤りはありません。
・キー入力のイベント処理を扱う単純な別のプログラムを
 作成
  キー入力のイベント処理がされず、同じ結果でした

質問は以上です。見ていただければ幸いです。
 

4

回答

91972

閲覧

4件の回答

評価

0

ためしにkeyPressedのところでint k = e.getKeyCode();の次にSystem.out.println(k);とやったら何が出力されますか?

あと、あくまでも個人的な考え方ですけれど、AppletはJavaの仕様変更により証明書がなければセキュリティーを下げない限りブラウザでは実行できなくなってしまってますし、私は今さらAppletをやらなくてもと思います。

評価

0

実行時、フォーカスはどこにある?
アプレットがキーを受け取ることをWindowsが知らない
と、アプレットはキーを受け取らない。

評価

0

init()の中に以下のコードを追加するとハンドラーが起動
されるようになると思います。

 lb2.setFocasable(true);

キー入力というのはフォーカスを持つコンポーネントが受
け取るようになっているのですが、全てのコンポーネント
がフォーカスを持つ状態になれるわけではなく、キー入力
を必要としない表示だけのコンポーネントにはフォーカス
は移動してきません。

ご質問のAppletを構成するGUIコンポーネントはJApplet, 
JPanel(JAppletのcontentPane),JLabelなどですがこれら
はデフォルトではキー入力の処理を行わないものばかりな
のでフォーカスが移動してこないようです。

ひょっとしたらJREのバージョンやブラウザ上で実際に動
かすかどうかなどの環境条件によってはフォーカスが移動
してくるのかも知れません。
(自分はJDK1.8.0_25,AppletViewerで試しました。)

参考書を自分の目で確認していないのではっきりとはわか
りませんが、もしあなたが提示されたコードが参考書に記
載された例と全く同一なのだとしたら、少なくとも最新の
JDKでAppletViewerを使った場合には期待通りの動きをし
てくれないことから、配慮不足のコードだったのではない
かと思います。

ちなみにアプレットではなく単独のアプリケーションとし
てJFrameを使って同様のコードを書くとsetFocasable()を
一切使わずとも期待通りハンドラーが動いてくれます。

評価

0

皆様、ご回答ありがとうございました。
いろいろ試しましたが、解決には至りませんでした。
ただ、わかったことは、本と自分の使っているJavaのバー
ジョンが違うということで問題が起こっているということ
です。
高橋先生の「やさしいjava活用編」は現在最新で第5版が
でておりますが、自分が持っている本は第2版なのです。
古本屋で見つけて買ってしまったのですが、よく考えると
IT関連のものを古本屋で買うとかどうかしてました。

最新版を入手して練習していこうと思います。


質問から6ヶ月以上経過しているので、回答を書き込むことはできません。