FrameA里面有几个toggleButton,我想用这几个togglebutton来控制FrameB的开关.
比如事toggleButoon[0]控制FrameB[0]这个意思.
可是当我用for循环定义action的时候,提示说要把 i 变成 final.
谢谢.FrameA代码
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;import javax.swing.JFrame;
import javax.swing.JToggleButton;
public class FrameA extends JFrame implements ActionListener {
int i=1;
public FrameB fb[];
JToggleButton toggleButton[];
/**
 * Launch the application
 * @param args
 */
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrameA frame = new FrameA();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
 * Create the frame
 */
public FrameA() {
super();
getContentPane().setLayout(null);
fb = new FrameB[10];
JToggleButton toggleButton[] = new JToggleButton[3];

setBounds(100, 100, 195, 180);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i=0; i<3; i++){
toggleButton[i] = new JToggleButton();
toggleButton[i].setText("ToggleButton");
toggleButton[i].setBounds(10, 25+i*50, 144, 26);
getContentPane().add(toggleButton[i]);

toggleButton[i].addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
JToggleButton newtb1 = (JToggleButton)arg0.getSource();
if(newtb1.isSelected())
{
System.out.println("on");
fb[i]= new FrameB(); //问题出在这里,说是要把i变成final
}else{
System.out.println("off");
fb[i].dispose(); //同样,i的问题
}

}
});

}
}
}

解决方案 »

  1.   

    在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明final。
      

  2.   

    那如果想实现的话,要怎么做呢?
    ToggleButton的数量是动态的,这里取了3只是作为测试.
      

  3.   

    toggleButton[i].setText("ToggleButton");将这个改为:toggleButton[i].setText("ToggleButton" + i);
    然后在actionPerformed中可以个通过newtb1.getText()中的数字来判断是第几个按钮
      

  4.   

    不使用匿名内部类ActionListener,而是新写一个类ActionListenerXXX
    給这个类构造函数加个参数i,同时加一个属性
    不就可以了吗
    也就是一个按钮有一个ActionListenerXXX对象,同时这个对象有个属性记录是那个按钮以oo的思想来写的话都不需要传i而是直接传递button对象給你新写的ActionListenerXXX类做属性就行了,通过构造函数传不加final是非静态语言才能实现的比如js之类。
      

  5.   

    谢谢了,貌似很强,我这几天问的问题都是你回答的哦,lol.