2016-06-16 4 views
-1

Предположим, у меня есть JDialog с 3 текстовыми полями First, Last и LastFirst. Когда LastFirstreceives фокусируется, он должен быть установлен как конкатенация первого & последним, но только если первые & последние не пустые. Вот уместный код из моего примера, который не работает: Что мне не хватает?Поле настройки на основе подтвержденных других полей

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

Моя ошибка была выдавшего txtFirst.requestFocusInWindow() после showMessageDialog. Перемещение его в BREEN showMessageDialog устраняет проблему.

По-видимому, когда это происходит, прежде чем фокус восстановится LastFirst, вызвав сообщение снова, но к тому времени фокус был сброшен до Первого. Трудно объяснить, но ответ, очевидно, заключается в том, чтобы сначала запросить фокус, а затем выпустить сообщение.