質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

Java Mac Eclipse

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,061

score 10

MacのEclipseで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 + "ですね。");
}
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/11/07 00:08

    http://www.fortinet.co.jp/security_blog/160205-java-browser-plugin-is-dead.html  Java アプレットは今後ブラウザ側で動作しなくなっていきます。

    キャンセル

回答 1

checkベストアンサー

0

提示されたコードを動かしてみたところ、
確かに押されたキーが拾えないことを確認しました。

どうやら、表示されているアプレットがフォーカスを取得できていない事が
原因のようです。

解決策としては、

public void init(){

        // 初期表示の際にフォーカスを得る
        setFocusable(true);

        Container cnt = getContentPane();

        lb1 = new JLabel("矢印キー");
        lb2 = new JLabel();

        cnt.add(lb1, BorderLayout.NORTH);
        cnt.add(lb2, BorderLayout.SOUTH);

        addKeyListener(new SampleKeyListener());
    }

のように、init() 内に setFocusable(true)を指定することで
アプレットがフォーカスを取得できるようになり、キーイベントも正常に拾えました。

ただ、ここで指定している値はデフォルトで true になっているようなので、
なぜ初期状態でフォーカスを取得できるようになっていないのかは謎ですね…

詳しい理由が判明した場合は追記させていただきます。

 追記(2016/11/6)

コメント欄にてご指摘いただきました。

今回の様にアプレット起動時にフォーカスを取得する必要があるならば、
setFocusable(true) を指定して解決することがベターである。
しかし、focusable 自身の値はデフォルトで true であり、setFocusable(true) の
意図が後からコードを見たときに分からなくなる可能性があるため、
コメントなどを付記するのが良い、との結論に至りました。

setFocusable(true)を指定する理由や、詳しい経緯はコメント欄を参照下さい)

ご意見下さいました KSwordOfHaste さん、ありがとうございました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/06 22:17

    @KSwordOfHaste さん
    解説ありがとうございます。 requestFocus を呼ぶ前に visible になっていないといけなかったのですね。
    そうすると、
    init 内に

    addComponentListener(new SampleComponentListener());

    として、

    class SampleComponentListener implements ComponentListener {
    @Override
    public void componentResized(ComponentEvent e) {}

    @Override
    public void componentMoved(ComponentEvent e) {}

    @Override
    public void componentShown(ComponentEvent e) {
    requestFocus();
    }

    @Override
    public void componentHidden(ComponentEvent e) {}
    }

    みたいな感じで、コンポーネントが表示されたときに requestFocus するのがより自然な感じですかね。(とはいえ、挙動的にはほぼ同じなのでどちらでも良いという結論になりそうですが)
    実際、そのようにすることでフォーカスを取れることを確認できました。

    改めて、有益な情報を下さいまして、ありがとうございました。

    キャンセル

  • 2016/11/06 23:24

    画面の表示中に発生する様々なイベントでフォーカスを移動するならrequestFocusが自然に見えますが、初期表示でしかフォーカス制御をやらないなら(簡潔なので)setFocusableでもよいと感じます。ただ自明な仕様に見えないので、後から見て思い出せるように「初期表示の際にフォーカスを得るためにこれが必要」などとコメントを付けたいです。

    キャンセル

  • 2016/11/07 00:04

    ありがとうございます。
    確かに、そのままでは後から参照した場合になぜ setFocusable が入っているかがわかりにくいですね。

    コメントいただいた内容について、記事の方に追記させていただきました。
    ご指摘ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る