События срабатывают в конструкторе формы - Java
Формулировка задачи:
Есть событие по нажатию кнопки на форме и событие, возникающее при получении фокуса текстовым полем. Но они срабатывают раньше, когда форма только создается в конструкторе. Из-за этого возникают ошибки и форма иногда глючит.
Как избежать такого эффекта? Ниже привожу код конструктора формы:
public AddPassword(boolean isCrypted, String cipher) {
//описываю обработчик для текстовых полей (срабатывает на получение фокуса)
fadapter = new FocusAdapter() {
@Override
public void focusGained(FocusEvent arg0) {
//восстанавливаем белый цвет окна
JTextField field = (JTextField)arg0.getSource();
if(field.getBackground()==Color.RED) field.setBackground(Color.WHITE);
}
};
setAlwaysOnTop(true);
setResizable(false);
setTitle("\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043A\u043E\u043B\u043B\u0435\u043A\u0446\u0438\u0438");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 593, 211);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel label = new JLabel("\u0424\u0418\u041E \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430*");
label.setBounds(10, 11, 92, 14);
contentPane.add(label);
nameField = new JTextField();
nameField.addFocusListener(fadapter); //указываем обработчик
nameField.setBounds(112, 8, 455, 20);
contentPane.add(nameField);
nameField.setColumns(10);
JLabel label_1 = new JLabel("\u041E\u0431\u044A\u0435\u043A\u0442*");
label_1.setBounds(10, 39, 92, 14);
contentPane.add(label_1);
objectField = new JTextField();
objectField.addFocusListener(fadapter);
objectField.setColumns(10);
objectField.setBounds(112, 36, 455, 20);
contentPane.add(objectField);
JLabel label_2 = new JLabel("\u041B\u043E\u0433\u0438\u043D*");
label_2.setBounds(10, 67, 92, 14);
contentPane.add(label_2);
loginField = new JTextField();
loginField.addFocusListener(fadapter);
loginField.setColumns(10);
loginField.setBounds(112, 64, 455, 20);
contentPane.add(loginField);
JLabel label_3 = new JLabel("\u041F\u0430\u0440\u043E\u043B\u044C*");
label_3.setBounds(10, 95, 92, 14);
contentPane.add(label_3);
passwordField = new JTextField();
passwordField.addFocusListener(fadapter);
passwordField.setColumns(10);
passwordField.setBounds(112, 92, 455, 20);
contentPane.add(passwordField);
JLabel label_4 = new JLabel("\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435");
label_4.setBounds(10, 123, 92, 14);
contentPane.add(label_4);
commentField = new JTextField();
commentField.setColumns(10);
commentField.setBounds(112, 120, 455, 20);
contentPane.add(commentField);
JButton saveButton = new JButton("\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C");
//здесь событие описывается стандартным образом, причем он выполнится, будто в линейной программе (не по событию, а по порядку описания)...
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean allRight = checkField(nameField) && checkField(objectField) && checkField(loginField) && checkField(passwordField);
if(allRight)
{
dispose();
}
else appdata.SayWarning("Одно или несколько обязательных полей не заполнены!");
}
});
saveButton.setBounds(112, 151, 202, 23);
contentPane.add(saveButton);
JButton cancelButton = new JButton("\u041E\u0442\u043C\u0435\u043D\u0430");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
cancelButton.setBounds(365, 151, 202, 23);
contentPane.add(cancelButton);
if(isCrypted && cipher != null)
{
passwordField.setEditable(false);
passwordField.setText(cipher);
nameField.setEditable(false);
objectField.setEditable(false);
loginField.setEditable(false);
commentField.setEditable(false);
}
}Решение задачи: «События срабатывают в конструкторе формы»
textual
Листинг программы
AddPassword ap = new AddPassword(!cryptButton.isSelected(), null); //создаем диалог для добавления нового пароля ap.setVisible(true); //отображаем форму PasswordCard pc = ap.getCard(); //считываем данные if(pc != null) appdata.currentCollection.add(pc); //записываем данные LoadCurrentCollection(); //обновляем коллекцию