プロが教えるわが家の防犯対策術!

こんばんは。今awtでGUIを作成しています。
テキストフィールドを作成し、入力したあとエンタ―ボタンを押したら桁数チェックなどを行い、妥当な入力であればカーソルを次のテキストフィールドに移動させ、妥当でなければ警告のダイアログボックスをだすアクションリスナーをaddActionListenerで作っていたのですが、
入力を確定させるのは何もエンターキーだけではなく、人によってはタブキーとか次のテキストボックスを選択して確定する人もいるだろうと思い、addFocuslistenerも加えました。以下がその部分です。

field1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae){
String gt_field1=field1.getText();
if(gt_field1.length()==5){keycheck();}
else{Tyuui("無効な入力です","5桁の文字を入力してください。");}
}
}
);
field1.addFocusListener(
new FocusListener(){
public void focusLost(FocusEvent e){
String gt_field1=field1.getText();
if(gt_field1.length()==5){keycheck();}
else{Tyuui("無効な入力です","5桁の文字を入力してください。");}
}
}
);

しかしこのようにしたら、エンターキーを押した時、妥当な入力だったら次のテキストフィールドに移動させるようにしているので、Focuslistenerも反応し、もう一度同じ処理をしてしまいました。妥当な入力でないときは警告のダイアログが2回でてきました。

そこでaddActionListenerのほうにはなにも調べさせず、フォーカスをはずすだけにしたらどうかと思ったのですが、requestFocus()もありますが他のテキストフィールドにフォーカスを当てたらまたおかしな事になりそうなのでただフォーカスをはずし、どこにもフォーカスがあっていない状態にしたいのですが、いい方法とかございましたら教えてはいただけませんか。
またEnterキーを押しただけでなく、Tabキーを押したり、マウスで別のところをクリックしてフォーカスが外れた時も桁チェックなどを行い、妥当な桁なら次のテキストフィールドにフォーカスをあてるいい方法などございましたらアドバイスの方、おねがいします。

A 回答 (1件)

次に示すように、いろんなやり方があるけど、入力チェックもキーの動作のカスタマイズも、Swingのほうが設備が整っていて楽ですよ。


---------------------------------------------------
import java.awt.*;
import java.awt.event.*;

public class TfFocus{
 static Frame frame;
 static TextField tf1, tf2;
 static Label lab1, lab2;
 static boolean actionProcessed = false;

 public static void main(String[] args){
  frame = new Frame();
  tf1 = new TextField(10);
  tf2 = new TextField(10);
  lab1 = new Label("_______________________________");
  lab2 = new Label("_______________________________");
  frame.setLayout(new FlowLayout(FlowLayout.LEFT));
  frame.add(tf1);
  frame.add(tf2);
  frame.add(lab1);
  frame.add(lab2);

  tf1.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
    if (tf1.getText().length() != 5){
     lab2.setText("");
     lab1.setText("A: 5つの文字を入力しておくれ");
    }
    else{
     actionProcessed = true;
     lab2.setText("");
     lab1.setText("A: よろしい!,次へ行け");
     tf2.requestFocusInWindow();
    }
   }
  });

  tf1.addFocusListener(new FocusListener(){
   public void focusLost(FocusEvent e){
    if (actionProcessed){
     return;
    }
    else if (tf1.getText().length() != 5){
     lab1.setText("");
     lab2.setText("F: 5つの文字を入力してね");
     tf1.setText("");
     tf1.requestFocusInWindow();
    }
    else{
     lab2.setText("いいわよ!では次ね");
    }
   }

   public void focusGained(FocusEvent e){
   }
  });

  frame.pack();
  frame.setVisible(true);
  frame.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
 }
}
------------------------------------------------
    • good
    • 0
この回答へのお礼

ありがとうございます。非常に参考になりました。
動作も確認いたしました。本当にありがとうございました。

お礼日時:2008/05/15 19:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!