События срабатывают в конструкторе формы - Java

Узнай цену своей работы

Формулировка задачи:

Есть событие по нажатию кнопки на форме и событие, возникающее при получении фокуса текстовым полем. Но они срабатывают раньше, когда форма только создается в конструкторе. Из-за этого возникают ошибки и форма иногда глючит. Как избежать такого эффекта? Ниже привожу код конструктора формы:
Листинг программы
  1. public AddPassword(boolean isCrypted, String cipher) {
  2. //описываю обработчик для текстовых полей (срабатывает на получение фокуса)
  3. fadapter = new FocusAdapter() {
  4. @Override
  5. public void focusGained(FocusEvent arg0) {
  6. //восстанавливаем белый цвет окна
  7. JTextField field = (JTextField)arg0.getSource();
  8. if(field.getBackground()==Color.RED) field.setBackground(Color.WHITE);
  9. }
  10. };
  11. setAlwaysOnTop(true);
  12. setResizable(false);
  13. 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");
  14. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. setBounds(100, 100, 593, 211);
  16. contentPane = new JPanel();
  17. contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  18. setContentPane(contentPane);
  19. contentPane.setLayout(null);
  20. JLabel label = new JLabel("\u0424\u0418\u041E \u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\u0430*");
  21. label.setBounds(10, 11, 92, 14);
  22. contentPane.add(label);
  23. nameField = new JTextField();
  24. nameField.addFocusListener(fadapter); //указываем обработчик
  25. nameField.setBounds(112, 8, 455, 20);
  26. contentPane.add(nameField);
  27. nameField.setColumns(10);
  28. JLabel label_1 = new JLabel("\u041E\u0431\u044A\u0435\u043A\u0442*");
  29. label_1.setBounds(10, 39, 92, 14);
  30. contentPane.add(label_1);
  31. objectField = new JTextField();
  32. objectField.addFocusListener(fadapter);
  33. objectField.setColumns(10);
  34. objectField.setBounds(112, 36, 455, 20);
  35. contentPane.add(objectField);
  36. JLabel label_2 = new JLabel("\u041B\u043E\u0433\u0438\u043D*");
  37. label_2.setBounds(10, 67, 92, 14);
  38. contentPane.add(label_2);
  39. loginField = new JTextField();
  40. loginField.addFocusListener(fadapter);
  41. loginField.setColumns(10);
  42. loginField.setBounds(112, 64, 455, 20);
  43. contentPane.add(loginField);
  44. JLabel label_3 = new JLabel("\u041F\u0430\u0440\u043E\u043B\u044C*");
  45. label_3.setBounds(10, 95, 92, 14);
  46. contentPane.add(label_3);
  47. passwordField = new JTextField();
  48. passwordField.addFocusListener(fadapter);
  49. passwordField.setColumns(10);
  50. passwordField.setBounds(112, 92, 455, 20);
  51. contentPane.add(passwordField);
  52. JLabel label_4 = new JLabel("\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435");
  53. label_4.setBounds(10, 123, 92, 14);
  54. contentPane.add(label_4);
  55. commentField = new JTextField();
  56. commentField.setColumns(10);
  57. commentField.setBounds(112, 120, 455, 20);
  58. contentPane.add(commentField);
  59. JButton saveButton = new JButton("\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C");
  60. //здесь событие описывается стандартным образом, причем он выполнится, будто в линейной программе (не по событию, а по порядку описания)...
  61. saveButton.addActionListener(new ActionListener() {
  62. public void actionPerformed(ActionEvent e) {
  63. boolean allRight = checkField(nameField) && checkField(objectField) && checkField(loginField) && checkField(passwordField);
  64. if(allRight)
  65. {
  66. dispose();
  67. }
  68. else appdata.SayWarning("Одно или несколько обязательных полей не заполнены!");
  69. }
  70. });
  71. saveButton.setBounds(112, 151, 202, 23);
  72. contentPane.add(saveButton);
  73. JButton cancelButton = new JButton("\u041E\u0442\u043C\u0435\u043D\u0430");
  74. cancelButton.addActionListener(new ActionListener() {
  75. public void actionPerformed(ActionEvent e) {
  76. dispose();
  77. }
  78. });
  79. cancelButton.setBounds(365, 151, 202, 23);
  80. contentPane.add(cancelButton);
  81. if(isCrypted && cipher != null)
  82. {
  83. passwordField.setEditable(false);
  84. passwordField.setText(cipher);
  85. nameField.setEditable(false);
  86. objectField.setEditable(false);
  87. loginField.setEditable(false);
  88. commentField.setEditable(false);
  89. }
  90. }

Решение задачи: «События срабатывают в конструкторе формы»

textual
Листинг программы
  1. AddPassword ap = new AddPassword(!cryptButton.isSelected(), null); //создаем диалог для добавления нового пароля
  2. ap.setVisible(true); //отображаем форму
  3. PasswordCard pc = ap.getCard(); //считываем данные
  4. if(pc != null) appdata.currentCollection.add(pc); //записываем данные
  5. LoadCurrentCollection(); //обновляем коллекцию

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут