Java - Почему компонентные функции вызывают actionPerformed? - PullRequest
1 голос
/ 26 января 2010

В моем коде, два комбобокса добавлены в actionListener (this);

В другой части моего кода я вызываю функцию комбинированного списка, которая устанавливает индекс на определенное значение. Это, в свою очередь, снова вызывает actionPerfoemed, поэтому getSource == comboBox имеет значение true. Каждый раз, когда я вызываю функцию set, она снова вызывает actionPerformed, создавая стек вызовов функций, который затем раскручивается до первого.

Есть ли способ предотвратить это?

Ответы [ 2 ]

1 голос
/ 26 января 2010

Если проблема заключается только в начальной настройке, вы можете отложить добавление слушателя до тех пор, пока после не будут инициализированы. Здесь больше дискуссий здесь .

1 голос
/ 26 января 2010

Из учебника Swing ,

Комбинированные поля также генерируют события элемента, которые запускаются при изменении состояния выбора любого элемента.

Эти события будут генерироваться либо когда пользователь щелкает мышью по элементам, либо когда ваша программа вызывает setSelectedIndex ().

Возможно, вы не хотите, чтобы ваш метод actionPerformed () вызывался, когда ваша программа вызывает setSelectedIndex (). Вам может понадобиться логическое eventInitiatedBySoftware. В вашем основном (этом) классе вы могли бы сказать

synchronized(eventInitiatedBySoftware) {
  eventInitiatedBySoftware=true;
  comboboxeditor.setSelectedIndex(n);
}

и затем в вашем слушателе:

public void actionPerformed(ActionEvent ae) {
synchronized(eventInitiatedBySoftware) {
  if (eventInitiatedBySoftware) {
    eventInitiatedBySoftware=false; // clear your flag.
    return; // don't want to process this event.
  }

  // the rest of your method goes here

}

Когда ваше программное обеспечение хочет изменить значение, оно установит для логического значения значение true. Будет вызван метод actionPerformed, но ваш тест поймет, что это событие было инициировано программным обеспечением, и вернется перед выполнением любого существующего кода. Это очистит логическое значение, так что если пользователь теперь использует мышь для выполнения действия выбора, ваш код поймет, что он не был программно инициирован.

Кстати, возможно, вы неправильно поняли концепцию события. Например, я подозреваю, что вы на самом деле добавляете «this» в качестве прослушивателя событий для каждого комбобокса, а не добавляете «combobox» в качестве слушателей «this». Возможно, вы захотите взглянуть на Writing Event Listeners trail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...