- PR -

java.awt.ButtonのENTERでbeep音が発生する

1
投稿者投稿内容
helicon1
会議室デビュー日: 2004/12/03
投稿数: 3
投稿日時: 2004-12-03 11:47
こんにちは。この掲示板には大変お世話になっております。

現在、小型端末におけるJavaAppletの開発を行っておりますが次の問題
がどうしても解消できなくて困っております。皆さんの知恵を拝借いただけ
たらと思い投稿しました。

[環境]
 JDK 1.1.8 
 Java Applet
 ハンディ端末

[やりたいこと]
 java.awt.Buttonにフォーカスがアクティブな状態で、ENTERを押すと
 ボタンを押したことと同様の処理(ActionEvent)を行う。
 
[現在の問題]
 KeyEventでKeyEvent.VK_ENTERを拾って、その後ActionEventを作って
 dispatchする方法で、”一応”やりたいことが達成できるのですが、
 何故かbeep音が出てしまうのです。このbeep音が仕様上の問題になっ
 ています。
 普通にボタンにフォーカスを当てて、(PC上で)SPACEキーをおしたり
 、マウスでクリックした場合は、beep音が出ないんですけど、何故か
 ENTERを押して
 KeyEvent → Enter → ActionEvent → dispatch でやるとbeep音が発
 生してしまうのです。
 beep音は仕様上、エラー時に発生させることになっており、Buttonで
 ENTERを押してbeep音がなってしまうと利用者が混乱してしまうことが
 予想されます。

ご存知の方いらっしゃいますでしょうか?
よろしくお願い致します。

当方がいろいろと試した、サンプルコードを次に記述します。
Buttonを継承したSomeButtonクラスの中にKeyAdapterを継承したインナー
クラスを作って以下のイベント処理を記述しています。
方法1〜3は、当方が試したほかのイベントへの転送であり、実際動作さ
せるときは一つの方法です。
========================================================
<pre>
※ボタンに登録するキーイベント

public void keyPressed(KeyEvent e) {

int c = e.getKeyCode();
// KEYの判定
switch (c) {
case KeyEvent.VK_ENTER : // ENTER
break;
}
}

/**
* ENTERが押されたときはClickと同様の処理を行う
* (外部クラスに出してstatic化可能)
*
*/
private void actionENTER() {
System.out.println("ENTERが押されました");
※方法1 マウスイベントを発生させてみる → 反応無
MouseEvent me =
new MouseEvent(
SomeButton.this,
MouseEvent.MOUSE_CLICKED,
System.currentTimeMillis(),
0,
Button.this.getBounds().x - 10,
Button.this.getBounds().y - 10,
1,
false);
SomeButton.this.dispatchEvent(me);

※方法2 スペースキーのイベントを発行させてみる → 反応無 KeyEventの種類によっては例外発生
KeyEvent ke =
new KeyEvent(
SomeButton.this,
KeyEvent.KEY_PRESSED,
System.currentTimeMillis(),
0,
KeyEvent.VK_SPACE,
(char) KeyEvent.VK_SPACE);
SomeButton.this.dispatchEvent(ke);

// 何故か以下の方法だとbeep音が発生する
ActionEvent ae =
new ActionEvent(
SomeButton.this,
ActionEvent.ACTION_PERFORMED,
SomeButton.this.getLabel());
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae);
SomeButton.this.dispatchEvent(ae);
}
</pre>
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-12-03 12:29
おそらく呼ばれたKeyListenerで処理できなかったと判断され、その親クラスで処理しようとしたけど出来なかったため、Beep音が鳴っていると思われます。

そこで、ActionEventを投げた後、KeyEvent#consume()を呼べば、解決するかもしれません。
helicon1
会議室デビュー日: 2004/12/03
投稿数: 3
投稿日時: 2004-12-03 12:59
かずくん さん

返信ありがとうございます。
早速試してみます。


helicon1
会議室デビュー日: 2004/12/03
投稿数: 3
投稿日時: 2004-12-03 13:21
かずくん さん

以下のように修正したところ、beep音なしで動作しました!!
ありがとうございました。

コード:
        /**
         * ENTERが押されたときはClickと同様の処理を行う
         * (外部クラスに出してstatic化可能)
         *
         */
        private void actionENTER(KeyEvent ke) {
            System.out.println("ENTERが押されました");
            ActionEvent ae =
                new ActionEvent(
                    CommonButton.this,
                    ActionEvent.ACTION_PERFORMED,
                    CommonButton.this.getLabel());
            CommonButton.this.dispatchEvent(ae);
            ke.consume(); // <-- 追加
        }

1

スキルアップ/キャリアアップ(JOB@IT)