Из учебника 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.