
TextFieldでフォーカスを失った時に
入力値をチェックするプログラムがあります。
入力値が不正な場合、メッセージを表示します。
また、終了ボタンで終了するか確認するメッセージを
表示します。
このとき、TextFieldに不正な値を入力し、
終了ボタンを選択するとメッセージが2回表示されます。
TextFieldのFocusAdapterのFocusLost処理により、
他のイベント処理をさせないようにしたいのですが、
戻り値がvoidということもあり、
制御でなきないのでしょうか?
よい方法はありますか?
キーイベントとマウスイベントで
フォーカスのあるコンポーネントを保持し、
変更されたら入力値チェックを行う。
と考えてみましたが、何か問題が起きてしまいそうで。
よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>フォーカスが外れた時点でDBからデータを取ってきてまして、自動表示をさせたい箇所があるんです。
うーん、必然性がいまいち理解できませんが、どうしてもフォーカスイベントで処理したいという事だけは解かりました。
で、2つのイベント発生の内、一方のイベント処理を無効にする一番単純な方法は判定用フラグを使う方法でしょうかね。
要するに、windowClosing() メソッドが呼ばれた場合は、同時に発生する focusLost() メソッド内の処理を行わなければ良いのですから、、、
boolean flag=true;
と、メンバ領域でブール変数 flag を宣言しておき、フォーカスロストイベント内の処理を実行する時は、、、
public void focusLost(FocusEvent e){
if (flag){
// DB からのデータの取得..etc...
}
}
と、判定用のブール値が真の場合にだけにします。
で、次はウインドウクローズ内の処理です、、、
public void windowClosing(WindowEvent e){
flag=false;
final Dialog d=new Dialog();
Button close=new Button("CLOSE");
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
Button cancel=new Button("CANCEL");
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
d.setVisible(false);
flag=true;
}
});
// サイズ指定や、ボタン組み込み等の処理は省略
}
と、まずは判定用ブール値を偽にします。
これで、この後でフォーカスロストイベントが呼び出されても DB 等へのアクセス処理は実行されません。
終了するのでしたら判定用ブール値はそのままで構いませんが、もし終了をキャンセルした場合には再度判定値を真へ戻さなくてはいけませんので、キャンセルボタンを押したときにその処理をしています。
しかし、一抹の不安として「どのプラットフォーム、VM でも必ず WindowEvent→FocusEvent」という同じ順序でイベントが発生する保証があるのかどうか不明な点です。
ですから、本当だったらフォーカスイベントとウィンドウイベント2つのイベントが同時に処理され得るという事態は避けた方が無難なのですけどね。
No.1
- 回答日時:
TextField にフォーカスが当たった状態から、Frame 右上の閉じるボタン「×」が押された場合に WindowEven、FocusEvent の両方が発生し2つダイアログ(又は、それに類するメッセージ・応答処理)が表示されてしまうという事でしょうか?
上記の解釈が正しいと仮定して、気になる点があります。
ユーザから見て、閉じるボタンを押すという事は「作業を途中であっても停止し、アプリケーションを終わらせたい」場合だと思います。
もちろん、押し間違えという事も考えられますが、今回の場合は終了時にも終了等の了承確認をする訳ですから、その対応で押し間違え等の問題回避は出来ている訳です。
そのユーザの意思決定に関わらず、TextField への入力が完了していない場合は終了よりも優先して強制的な入力完了を強いるというのはアプリケーション上問題があると感じました(下手に厳しい入力条件であれば終了が出来ないという悲劇にもなりかねません・笑)
ですから、今回の場合、WindowEvent と FocusEvent でどちらを捨てるのかといえば FocusEvent の方になると思うのですがいかがでしょうか。
と、話しが多々脱線してしまいましたが、解決策を(笑
ここの掲示板などもそうですが、記入項目毎に入力値チェックをするのではなく、ユーザが記入を済ませたと「思った」時点で「OK」などの確認用ボタンを押してもらい、その時点で入力項目のチェックをするという手順を踏めば良いのではないかと思います。
まぁ、でもこの手の問題はケース・バイ・ケースですから上の方法を取れない場合もあるかと思います。
その場合は、その理由を補足して下さい。
そうすれば、それに合わせた回答なりアドバイスなりができると思いますので。
ありがとうございます。
フォーカスが外れた時点でDBからデータを取ってきてまして、自動表示をさせたい箇所があるんです。
他についてはアドバイスいただいたように確認用ボタンでチェックするようにしています。
なので、終了する前にチェックが行われてしまう、という状況に陥っています。
また何か手がありましたら教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Access(アクセス) Access の SetFocus について教えてください 5 2022/08/04 07:32
- Windows 10 Windows10の不具合(Critical Process Died) 9 2022/04/19 21:11
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) 余計なお世話的な「入力規則」?対策は? 2 2023/01/14 12:39
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Excel(エクセル) エクセルのマクロについて質問があります。 sheet1に数字を入力してsheet2を印刷したいのです 2 2023/06/07 14:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で別スレッドの終了を知りたい
-
Javaプログラムからポップアッ...
-
ラベルの表示までが異常に遅い...
-
[Java] while(true)の意味
-
FocusLostでイベント処理を中断...
-
ラジオボタンの選択判定
-
数値の定数を付ける時
-
WaitForSingleObjectの復帰時間
-
C#の処理をリアルタイムに表示...
-
ServletContextLisntener#conte...
-
tryの終了
-
ExcelVBA で文字列の特定の文字...
-
マルチスレッドのデバッグ
-
BLOB型の画像データを表示したい
-
Tomcat高負荷時の設定について
-
「UIスレッド」「マルチスレッ...
-
VBScriptでのWord印刷
-
Javaアプリケーション実行の返...
-
Javaでのデバッグコード削除
-
JavaScriptとJSPの連携
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Java] while(true)の意味
-
tryの終了
-
Javaでのデバッグコード削除
-
Javaアプリケーション実行の返...
-
Javaプログラムからポップアッ...
-
onBlurとonFocusの処理順序につ...
-
Tomcat高負荷時の設定について
-
数値の定数を付ける時
-
アコーディオンメニューをアン...
-
ラジオボタンの選択判定
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
C#で別スレッドの終了を知りたい
-
素数判定を再帰処理で
-
JavaScriptからJAVAクラスを呼...
-
switch文の中に、throws new Ex...
-
PHPでDB処理中にプログレスバー...
-
C#の処理をリアルタイムに表示...
-
Windowsサービスの処理
-
ftp 同時複数接続の負荷テスト...
おすすめ情報