Java JTabbedPane和stateChanged事件,带有bug的getTabCount()?

时间:2014-11-09 17:19:44

标签: java netbeans

我不是Java开发人员,但我尝试使用Netbeans 8.0.1和java 1.8.0_05作为向导应用程序。 我在项目中添加了一个JTabbedPane(带有5个选项卡)并关联了一个stateChanged事件来启用或禁用两个按钮:" next"和" prev"。

private void tabbedPaneStateChanged(javax.swing.event.ChangeEvent evt)                                        
{                                            
    bttPrev.setEnabled(tabbedPane.getSelectedIndex() > 0);
    bttNext.setEnabled(tabbedPane.getSelectedIndex() < (tabbedPane.getTabCount() - 1));
}

当我运行应用程序时,两个按钮都被禁用。在调试中我注意到了:

tabbedPane.getSelectedIndex() = 0
tabbedPane.getTabCount() = 1       ==> should be 5!!!!

当然,0 = 1 - 1然后bttNext被禁用。但是为什么tabbedPane.getTabCount = 1应该是5?如果我更改标签,它返回5正常工作。 我不明白这是否是java 1.8中的本机错误。这是可能的,还是有一个更好,更合理的解释,我没有抓住?

enter image description here

1 个答案:

答案 0 :(得分:3)

我认为问题是netbeans在添加面板之前将状态更改添加到tabbedpane。可能是因为这个问题。

如果你在initcomponent()方法之后放了sout,

//initComponents();
System.out.println("init");

。你会看到put as,

1
init

所以很明显状态事件在执行init组件方法时被触发,可能是当标签添加到窗格时

你可以做什么。

在添加3个面板之前添加statechange事件..

tabbedPane.addTab("lastpanel", jPanel5);

// add statechange event after adding 3 panels
tabbedPane.addChangeListener(new javax.swing.event.ChangeListener() {
        public void stateChanged(javax.swing.event.ChangeEvent evt) {
            tabbedPaneStateChanged(evt);
        }
});

另一个简单的解决方案//运作良好

在构造函数中更改状态twise

将这2行添加到班级的指导者

initComponents();//add following lines after this line
tabbedPane.setSelectedIndex(1);
tabbedPane.setSelectedIndex(0);