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