Я написал графический интерфейс с использованием SWING API.Как избежать исключения IndexOutOfBounds при динамическом обновлении JComboBox
Я получил набор форм, каждая форма помогает пользователю создать предопределенный тип объекта. По завершении пользователь подтверждает создание нажатием кнопки JButton.
У меня есть класс (DataManager), который следует за одноэлементным рисунком. Кроме того, класс следует за наблюдателем и фабрикой. DataManager является наблюдаемым объектом. Данные, которые наблюдаются в следующем формате:
public static List<Target> targets = new ArrayList<Target>();
DataManager класс содержит набор методов для создания типа предварительного определения объекта.
Пример:
public static final void createTarget(String id, double x, double y, double z){
targets.add(new Target(id,x,y,z));
notifyTargetObservers();
}
Одной из форм является объектом наблюдатель, который наблюдает DataManager за обновлениями в любой из данных, содержащихся в его списках (Ex список целей ....).
IObserve:
public interface IObserve {
public void updateTargets();
public void updateSources();
public void updateFluids();
}
Наблюдатель реализует методы, введенные в IObserver.
Пример:
@Override
public void updateTargets(){
cbAnalysisTargets.addItem(DataManager.targets.get(DataManager.targets.size()-1));
}
В cbAnalysisTargets является JComboBox, который требует, чтобы быть динамически обновляется, как новые объекты вводятся в окружающую среду.
IObservable:
public abstract class IObservable {
private static Set<IObserve> targetObservers = new HashSet<IObserve>();
private static Set<IObserve> sourceObservers = new HashSet<IObserve>();
private static Set<IObserve> fluidObservers = new HashSet<IObserve>();
public final void addTargetObserver(IObserve o){
targetObservers.add(o);
}
public final void addSourceObserver(IObserve o){
sourceObservers.add(o);
}
public final void addFluidObserver(IObserve o){
fluidObservers.add(o);
}
public static final void notifyTargetObservers(){
for(IObserve observer : targetObservers){
observer.updateTargets();
}
}
public static final void notifySourceObservers(){
for(IObserve observer : sourceObservers){
observer.updateSources();
}
}
public static final void notifyFluidObservers(){
for(IObserve observer : fluidObservers){
observer.updateFluids();
}
}
}
Проблема лежит в IndexOutOfBounds Exception. Исключение возникает в следующем сценарии:
1. Пользователь открывает первую форму и успешно инициирует создание 2 заранее определенных объектов одного и того же типа.
2. Пользователь открывает вторую форму; заполняет форму и после подтверждения (щелчок кнопки) получает исключение, указанное ниже.
В идеале я хотел бы получить помощь в решении следующей проблемы и разрешении приведенного ниже исключения.
Исключение:
Исключение в потоке "АВТ-EventQueue-0" java.lang.IndexOutOfBoundsException: Индекс: 1, размер: 1 в java.util.ArrayList.rangeCheck (Unknown Source) в java.util.ArrayList.get (Неизвестный источник) at fprof.application.data.frame.manager.content.AnalysisCreatorPanel.updateSources (AnalysisCreatorPanel.java:99) at fprof.application.utility.IObservable.notifySourceObservers (IObservable.java : 32) at fprof.application.data.manager.IDataManager.createSource (IDataManager.java:29) at fprof.application.dat a.frame.manager.content.SourceCreatorPanel $ 1.actionPerformed (SourceCreatorPanel.java:127) в javax.swing.AbstractButton.fireActionPerformed (Unknown Source) в javax.swing.AbstractButton $ Handler.actionPerformed (Unknown Source) в javax.swing.DefaultButtonModel.fireActionPerformed (Unknown Source) в javax.swing.DefaultButtonModel.setPressed (Unknown Source) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased (Unknown Source) в java.awt.Component.processMouseEvent (Unknown Source) в javax.swing.JComponent. processMouseEvent (Неизвестный источник) at java.awt.Component.processEvent (Неизвестный источник) at java.awt.Container.processEvent (Неизвестный источник) at java.awt.Component.dispatchEventImpl (Неизвестный источник)в java.awt.Container.dispatchEventImpl (Unknown Source) в java.awt.Component.dispatchEvent (Unknown Source) в java.awt.LightweightDispatcher.retargetMouseEvent (Unknown Source) в java.awt.LightweightDispatcher.processMouseEvent (Неизвестно Источник) на java.awt.LightweightDispatcher.dispatchEvent (Unknown Source) в java.awt.Container.dispatchEventImpl (Unknown Source) в java.awt.Window.dispatchEventImpl (Unknown Source) в java.awt.Component.dispatchEvent (Неизвестный источник) at java.awt.EventQueue.dispatchEventImpl (Неизвестный источник) at java.awt.EventQueue.access $ 500 (Неизвестный источник) at java.awt.EventQueue $ 3.run (Неизвестный источник) на java.awt.EventQueue $ 3.run (Unknown Source) в java.security.AccessController.doPrivileged (Native Method) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (Unknown Source) в java.security.ProtectionDomain $ 1. doIntersectionPrivilege (Unknown Source) в java.awt.EventQueue $ 4.run (Unknown Source) в java.awt.EventQueue $ 4.run (Unknown Source) в java.security.AccessController.doPrivileged (метод родной) на Java. security.ProtectionDomain $ 1.doIntersectionPrivilege (Unknown Source) в java.awt.EventQueue.dispatchEvent (Unknown Source) в java.awt.EventDispatchThread.pumpOneEventForFilters (Unknown Source) в java.awt.EventDispatchThread.pumpEventsForFilt эр (Unknown Source) в java.awt.EventDispatchThread.pumpEventsForHierarchy (Unknown Source) в java.awt.EventDispatchThread.pumpEvents (Unknown Source) в java.awt.EventDispatchThread.pumpEvents (Unknown Source) в java.awt. EventDispatchThread.run (Unknown Source)
EDIT 1: updateSource Метод:
@Override
public void updateSources(){
cbAnalysisSources.addItem(DataManager.sources.get(DataManager.sources.size()-1));
}