- PR -

JavaApplet タイピングアプレットでの入力文字制限について

1
投稿者投稿内容
またたび
会議室デビュー日: 2005/12/16
投稿数: 3
投稿日時: 2005-12-16 14:44
初めてスレを立てさせてもらう者です。
類似処理などを探しましたが見つからないため、皆さんの意見を参考にと思った次第です。

アプレットで簡単なタイピングソフトを作成しています。
主な仕様を下記に記載します。

*.a〜zキーを順番に押下して、時間を計測するプログラムです。
1.起動時、テキストフィールドはShiftキーしか受け付けない。
2.Shiftキー押下で、スタートします。
3.スタートしたらa〜zキーだけを、テキストフィールドは受け付ける。

これだけではタイピングとは言えないですが、問題の部分周りだけを説明しました。
今の段階では、3の部分でkeyTypedイベントが反応してくれない状態です。
部分的なソースを下記に記載します。


public class TypingSoft extends Applet implements Runnable,ActionListener,KeyListener
{
  int i;
  String s ;
  Thread th;
  String text = "abcdefghijklmnopqrstuvwxyz";
  TextField tf = new TextField();

  public void init()
  {
    i = 0;

    tf.addKeyListener(this);

    // 起動時はShiftキーのみ活性させる処理
    tf.addKeyListener(new KeyAdapter()
    {
      public void keyTyped(KeyEvent e)
      {
        if(e.getKeyChar() != e.VK_SHIFT)
        {
          e.consume();
        }
      }

      public void keyPressed(KeyEvent e)
      {
        if(e.getKeyCode() == e.VK_SHIFT)
        {
          tf.addKeyListener(new KeyAdapter()
          {
            // Shiftキー押下後の文字入力制限処理
            public void keyTyped(KeyEvent e)
            {
              char chr = e.getKeyChar();
              if(text.indexOf(chr) < 0 && !Character.isIdentifierIgnorable(chr))
              {
                e.consume();
              }
            }
          });
        }  
      }
    });
  }

  /**
   * Shiftキー押下時の処理
   */
  public void keyPressed(KeyEvent e)
  {
    if(e.getKeyCode() == e.VK_SHIFT)
    {
      if(th == null)
      {
        i = 0;
        th = new Thread(this);
        th.start();

        tf.addKeyListener(new KeyAdapter()
        {
          // zキー押下時の処理
          public void keyPressed(KeyEvent e)
          {
            if(e.getKeyCode() == KeyEvent.VK_Z)
            {
              if(th != null) th = null;
            }
          }
        });
      }
    }
  }

  /**
   * 実装では使わないメソッドも明記する
   */
  public void keyTyped(KeyEvent e){}
  public void keyReleased(KeyEvent e){}
}

長くなりましたが、各GUi部品作成やrun()などは省略しております。
問題なのは、init()とkeyPressed()でのKeyListenerが重複してしまっていることでしょうか?
Shiftキーのイベントが常に残ってしまっているという現象です。
分かりにくいかもしれませんが、何かアドバイスをいただけたらと。

それでは、よろしくお願い致します。

[ メッセージ編集済み 編集者: またたび 編集日時 2005-12-16 14:53 ]

[ メッセージ編集済み 編集者: またたび 編集日時 2005-12-16 16:06 ]

[ メッセージ編集済み 編集者: またたび 編集日時 2005-12-16 16:15 ]
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2005-12-20 21:08
こんにちは。
おそらく、processKeyEvent(KeyEvent)、またはprocess〜()メソッドで
操作できると思いますよ。
またたび
会議室デビュー日: 2005/12/16
投稿数: 3
投稿日時: 2005-12-20 23:27
お返事ありがとうございます。
processKeyEvent()ですか、盲点でした。
APIを参照しながら、コーディングしてみたいと思います。
結果が分かり次第、会議室を通してご報告させていただきます。

[ メッセージ編集済み 編集者: またたび 編集日時 2005-12-20 23:28 ]
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2005-12-21 00:02
要はフラグの立て方とaddKeyListener,removeKeyListenerの
タイミングの問題だと思うので、KeyListener(KeyAdapter)でも、
実現できると思いますが、 processKeyEvent()の方が読みやすく(簡素)に
書けると思います。

あと、問題になりそうなのは、日本語入力の場合ですが、
その場合、processInputMethodEvent()で実現できるでしょう。

この掲示板は、JavaのGUIについては反応が薄い気がするので、
他をあたると良いかもしれません。

またたび
会議室デビュー日: 2005/12/16
投稿数: 3
投稿日時: 2005-12-21 09:28
ご丁寧にありがとうございます。
確かに、スレッドによって返答数がマチマチですものね。
JavaのGUIは、まだまだ発展途上なので全体的に浸透率が低いのかもですね。

ここ最近は、立て込んでいまして時間が空いたときにでもテストしてみます。
また、ご報告致します。
1

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