FrameA里面有几个toggleButton,我想用这几个togglebutton来控制FrameB的开关.
比如事toggleButoon[0]控制FrameB[0]这个意思.
可是当我用for循环定义action的时候,提示说要把 i 变成 final.
谢谢.
FrameA代码
- Java code
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的问题 } } }); } }}
------解决方案--------------------
在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明final。
------解决方案--------------------
toggleButton[i].setText("ToggleButton");
将这个改为:
toggleButton[i].setText("ToggleButton" + i);
然后在actionPerformed中可以个通过newtb1.getText()中的数字来判断是第几个按钮
------解决方案--------------------
不使用匿名内部类ActionListener,而是新写一个类ActionListenerXXX
給这个类构造函数加个参数i,同时加一个属性
不就可以了吗
也就是一个按钮有一个ActionListenerXXX对象,同时这个对象有个属性记录是那个按钮
以oo的思想来写的话都不需要传i而是直接传递button对象給你新写的ActionListenerXXX类做属性就行了,通过构造函数传
不加final是非静态语言才能实现的比如js之类。