环境情况介绍:
我做的是纯Java程序。工具是JBuilder x。通过一个jButton1的按钮,动态地加上若干个CheckBox,在我的陈序中是以数组CheckBox[]实现的(加载CheckBox的数量是依据查询数据库记录条数决定的)。每一个CheckBox都会动态地加载监听器。
以上描述都已经实现。
提问:
在实现每个CheckBox的动作时,我遇到麻烦,请看代码:
public class Frame1 extends JFrame
{
...... *********************************************
void jButton1_actionPerformed(ActionEvent e) throws SQLException
{
int n=0;
......
while (rs.next()) //查询数据库,n为查到的记录数
{
......
n++;
}
....... JCheckBox[] jCheckBox = new JCheckBox[n]; #########################
for(i=0;i<n;i++)
{
jCheckBox[i] = new JCheckBox();
jPanel8.add(jCheckBox[i], new XYConstraints(14, a+=20, 343, 22));
......
} jCheckBox[i].addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(jCheckBox[i].isSelected()==true) @@@@@@@@@@@@@@@@@@@@@@@@
{
jTextArea1.setText("111");
}
} }); }
this.show();
con.close();
}
}
......为便于描述,我将以上程序比较重要的几行用符号标出!
以上程序JBuilder会说:@@@行 local variable jCheckBox is accessed from within inner class;needs to be declared final at line 402(402:14)于是我将jCheckBox[]改在****行定义:JCheckBox[] jCheckBox;并将###行改为jCheckBox = new JCheckBox[n];
程序没有报错,可以运行。但是点击jButton1,报错如下:java.lang.ArrayIndexOutOfBoundsException: 4
at untitled1.Frame1$1.itemStateChanged(Frame1.java:402)
at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:1814)
at javax.swing.AbstractButton$ForwardItemEvents.itemStateChanged(AbstractButton.java:1850)
at javax.swing.DefaultButtonModel.fireItemStateChanged(DefaultButtonModel.java:477)
at javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:237)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:254)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)我觉得这个错误可能是数组越界产生的,但改来改去,错误依旧。
由哪位能耐心看看我的这种情况?
我做的是纯Java程序。工具是JBuilder x。通过一个jButton1的按钮,动态地加上若干个CheckBox,在我的陈序中是以数组CheckBox[]实现的(加载CheckBox的数量是依据查询数据库记录条数决定的)。每一个CheckBox都会动态地加载监听器。
以上描述都已经实现。
提问:
在实现每个CheckBox的动作时,我遇到麻烦,请看代码:
public class Frame1 extends JFrame
{
...... *********************************************
void jButton1_actionPerformed(ActionEvent e) throws SQLException
{
int n=0;
......
while (rs.next()) //查询数据库,n为查到的记录数
{
......
n++;
}
....... JCheckBox[] jCheckBox = new JCheckBox[n]; #########################
for(i=0;i<n;i++)
{
jCheckBox[i] = new JCheckBox();
jPanel8.add(jCheckBox[i], new XYConstraints(14, a+=20, 343, 22));
......
} jCheckBox[i].addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(jCheckBox[i].isSelected()==true) @@@@@@@@@@@@@@@@@@@@@@@@
{
jTextArea1.setText("111");
}
} }); }
this.show();
con.close();
}
}
......为便于描述,我将以上程序比较重要的几行用符号标出!
以上程序JBuilder会说:@@@行 local variable jCheckBox is accessed from within inner class;needs to be declared final at line 402(402:14)于是我将jCheckBox[]改在****行定义:JCheckBox[] jCheckBox;并将###行改为jCheckBox = new JCheckBox[n];
程序没有报错,可以运行。但是点击jButton1,报错如下:java.lang.ArrayIndexOutOfBoundsException: 4
at untitled1.Frame1$1.itemStateChanged(Frame1.java:402)
at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:1814)
at javax.swing.AbstractButton$ForwardItemEvents.itemStateChanged(AbstractButton.java:1850)
at javax.swing.DefaultButtonModel.fireItemStateChanged(DefaultButtonModel.java:477)
at javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:237)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:254)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)我觉得这个错误可能是数组越界产生的,但改来改去,错误依旧。
由哪位能耐心看看我的这种情况?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货