【发布时间】:2012-07-20 12:38:14
【问题描述】:
我有一个包含多个组件的应用程序。其中一个是JTabbedPane,里面有其他东西(很明显)。我通过这个getter只访问这个面板:
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;
}
所以第一次,我访问它(即当它尚未创建时),我创建它,其他时候,我只是返回已经创建的JTabbedPane。我已经被告知这不是最好的技术(如果有人可以告诉我一个不会弄乱布局组合代码的更好的技术,我非常愿意接受建议)。
现在,这在 99% 的情况下(应用程序启动)都可以正常工作。在 1% 中,我得到一个
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)
我不会在堆栈中进一步深入,但这基本上是 GUI 的创建。 Tab 是扩展的 JPanel。我无法真正弄清楚,问题出在哪里,我能做些什么来防止它。显然,我可以将 Tab.java 的第 386 行包装在 try/catch 中,但这并不能解决问题,它只是解决了症状......
那么,你知道问题出在哪里,我该如何解决或者我应该怎么做?
【问题讨论】:
-
你确定在堆栈跟踪后面没有
Caused by: ...吗? -
Tab.java 中的第 80 行是什么?
-
您可能想尽快发布SSCCE 以获得更好的帮助。
-
你只是在 Event Dispatch Thread 中操作你的 Swing 组件吗?
-
@AleksG 嗯...下次发生时我会看到,但我很确定,没有
Caused by:,因为我会注意到这一点。 Tab.java 中的第 80 行是构造函数中的super();调用(调用JPanel#JPanel())。
标签: java swing exception jtabbedpane