环境情况介绍:
我做的是纯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)我觉得这个错误可能是数组越界产生的,但改来改去,错误依旧。
由哪位能耐心看看我的这种情况?