2016-06-16 13 views
-1

First、Last、LastFirstという3つのテキストフィールドを持つJDialogがあるとします。 LastFirstがフォーカスを受け取ったとき、最初に&の連結として設定されますが、最後に&が空でない場合に限ります。ここに私の例の適切なコードは、動作しません: 私は何が足りないのですか?有効な他のフィールドに基づいてフィールドを設定する

import java.awt.Container; 
import java.awt.GridLayout; 
import javax.swing.JOptionPane; 
public class FieldValidatedSetting extends javax.swing.JFrame { 
private javax.swing.JTextField txtFirst; 
private javax.swing.JTextField txtLast; 
private javax.swing.JTextField txtLastFirst; 
// 
//This is supposed to concatenate Last & First and set LastFirst. 
// Empty First or Last fields should result in a message dialog 
// and return for user correction. Problem is it issues the message twice! 
// Please excuse the crummy layout./ 
// Constructor 
private void txtLastFirstFocusGained(java.awt.event.FocusEvent evt)            
if(txtLast.getText().isEmpty() || txtFirst.getText().isEmpty()){ 
     JOptionPane.showMessageDialog(null, "You must enter First & Last"); 
     txtFirst.requestFocusInWindow(); 
    } else{ 
     txtLastFirst.setText(txtLast.getText() + txtFirst.getText()); 
    } 
}    

public FieldValidatedSetting() { 
txtFirst = new javax.swing.JTextField(); 
txtLast = new javax.swing.JTextField(); 
txtLastFirst = new javax.swing.JTextField(); 

txtLastFirst.addFocusListener(new java.awt.event.FocusAdapter() { 
public void focusGained(java.awt.event.FocusEvent evt) { 
      txtLastFirstFocusGained(evt); 
} 
}); 
Container pane = getContentPane(); 
pane.setLayout(new GridLayout(1, 3)); 
pane.add(txtFirst); 
pane.add(txtLast); 
pane.add(txtLastFirst); 
pack(); 
} 
public static void main(String args[]) { 
java.awt.EventQueue.invokeLater(new Runnable() { 
public void run() { 
new FieldValidatedSetting().setVisible(true); 
} 
}); 
} 
} 
+1

''私は何が欠けていますか? ' - 有効な[mcve]を作成し投稿した場合、問題を実証するのに必要なコードだけを持つ小さくて完全なプログラムですコンパイルして実行してください。これは、あなたが間違っていることを完全に理解するのに役立ちます。これは、オフサイトリソースへのリンクとしてではなく、コード形式のテキストとして送信されるコードです。 –

+0

[FocusListener]と[PropertyChangeListener]を[example](http://stackoverflow.com/a/8703807/230513)に使用することがあります。 – trashgod

答えて

0

私の間違いはshowMessageDialog AFTER txtFirst.requestFocusInWindow()を発行しました。 showMessageDialogを実行する前に移動すると、問題が修正されます。

明らかに、LastFirstによってフォーカスが取り戻される前に、メッセージが再び表示されますが、その時点でフォーカスが最初にリセットされています。解説するのは難しいですが、答えはまずrequestFocusにしてから、メッセージを出してください。

関連する問題