События срабатывают в конструкторе формы - 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(); //обновляем коллекцию

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5