質問: clearbutton){ //色を黒に戻す text1.setForeground(Color.BLACK); text2.setForeground(Color.BLACK); //文字のない状態を入れる=("") text1.setText(""); text2.setText(""); } } } ```
回答: まず, 「text1/text2 にエラーメッセージをセットしたら OKボタンを押した処理は終わり」と勘違いされているようです. actionPerformed メソッドから抜けない限り, OKボタンを押した処理は終わりません. ですので, 追加されたというif文(クリアする処理)は, エラーメッセージをセットした後にすぐ実行されるため、「エラーの表示すらなくなって」しまいます. text1 が空の状態で OKボタンを押した時に text1/text2 にエラー表示され, その状態で **もう一度 OK ボタンを押す** とエラー表示が消えるというのは, 一般的な画面の操作とは異なるように感じます. エラーが表示されて, すぐまた OK ボタンを押そうと思うでしょうか. もしくは, 入力欄に表示されたエラーをわざわざ消して入力し直さなければならないと言われて, 面倒と思わないでしょうか. 消さなければならないとしたら, クリアボタンを押すことでしょう. それならいっそ, エラーなら OK ボタンを押せなくするのが良いかと思います. さらに言えば, text1 が空なら OK ボタンは押せなくするべきと思います. 結果表示に text2 がありますし, エラーの表示も text2 だけで良いようにも思います. 仕様の変更によって UI が分かり易くなり, コードで悩まないで済むこともあります. 可能でしたらご一考されては如何でしょうか. 仕様はさておきまして, エラーを表示したら一度 actionPerformed を抜け, 再度 actionPerformed が実行された時に, 前回がエラー表示だったかをチェックしてエラーを消したり色を戻したりという処理を行う必要があると思います. Screenクラスに text1Error フィールドを追加します. ``` class Screen extends JFrame implements ActionListener{ JTextField text1; JTextField text2; boolean text1Error = false; //text1 がエラーだった場合に true ``` actionPerformed で okButton が押された場合, text1Error によって処理を分けます. ``` //okbuttonが押された場合の処理 if(e.getSource() == okbutton){ if(text1Error) { //色を黒に戻す text1.setForeground(Color.BLACK); text2.setForeground(Color.BLACK); //文字のない状態を入れる=("") text1.setText(""); text2.setText(""); text1Error = false; }else { //入力欄がカラの場合の処理(赤字でエラーを表示) if(text1.getText().equals("")){ text1.setForeground(Color.RED); text2.setForeground(Color.RED); text1.setText("”エラー”(文字を入力してください)"); text2.setText("”エラー”(文字を入力してください)"); text1Error = true; //入力欄に文字が入力されていた場合、入力された文字を表示 }else{ text2.setText(text1.getText()); } } ``` text1 への(エラーを手で消す)操作による場合は, text1 のリスナ内で text1Error をチェックせずとも, 常に setForeground(Color.BLACK) と text1Error = false を実行しても大丈夫かもしれません.