События срабатывают в конструкторе формы - 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(); //обновляем коллекцию
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д