日期:2014-05-20  浏览次数:20681 次

Swing,使用togglebutton来开启和关闭多个窗口,如何实现,代码有问题.比较急,谢谢.
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之类。