Swing JTabbedPane lanza la excepción IndexOutOfBoundsException mientras se llena
Tengo una aplicación con varios componentes. Uno de ellos es unJTabbedPane
con otras cosas en ella (obviamente). Accedo a este panelsolamente a través de este captador:
public JTabbedPane getPlotTabbedPane() {
if (plotTabs == null) {
plotTabs = new JTabbedPane();
plotTabs.setFocusable(false);
plotTabs.add("Measurement", getPlotPanel());
plotTabs.add("Time", getPlotPanel().getTimePanel());
plotTabs.add("Data", getPlotPanel().getDataPanel());
plotTabs.add("Statistics", getPlotPanel().getStatisticsPanel());
plotTabs.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
getPlotPanel().refreshRenderer();
}
});
}
return plotTabs;
}
Así que la primera vez, accedo a él (es decir, cuando aún no está creado), lo creo, todas las otras veces, solo devuelvo lo creado.JTabbedPane
. Ya me dijeron que esta no es la mejor técnica (si alguien me puede decir una mejor que no estropee el código de composición del diseño, estoy muy abierto a las sugerencias).
Ahora, esto funciona perfectamente bien en, digamos, el 99% de los casos (inicio de la aplicación). En el 1% me sale un
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Vector.java:430)
at javax.swing.JTabbedPane.getTitleAt(JTabbedPane.java:1091)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.updateHtmlViews(BasicTabbedPaneUI.java:3564)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.componentAdded(BasicTabbedPaneUI.java:3699)
at java.awt.Container.processContainerEvent(Container.java:2065)
at java.awt.Container.processEvent(Container.java:2036)
at java.awt.Component.dispatchEventImpl(Component.java:4653)
at java.awt.Container.dispatchEventImpl(Container.java:2097)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.Container.addImpl(Container.java:1083)
at javax.swing.JTabbedPane.insertTab(JTabbedPane.java:703)
at javax.swing.JTabbedPane.addTab(JTabbedPane.java:777)
at javax.swing.JTabbedPane.add(JTabbedPane.java:814)
at companyname.product.gui.Tab.getPlotTabbedPane(Tab.java:386)
at companyname.product.gui.Tab.getFullPlotPanel(Tab.java:374)
at companyname.product.gui.Tab.initComponents(Tab.java:262)
at companyname.product.gui.Tab.<init>(Tab.java:80)
No iré más abajo en la pila, pero esto es básicamente la creación de la GUI.Tab
es una extensiónJPanel
. Realmente no puedo entender cuál es el problema ni qué puedo hacer para evitarlo. Obviamente, podría simplemente ajustar la línea 386 de Tab.java en untry/catch
, pero eso no resuelve el problema, solo resuelve los síntomas ...
Entonces, ¿sabes cuál es el problema, cómo puedo resolverlo o cómo debo hacer eso?