当前位置: 代码迷 >> J2SE >> Swing,使用togglebutton来开启和关闭多个窗口,怎么实现,代码有有关问题.比较急多谢
  详细解决方案

Swing,使用togglebutton来开启和关闭多个窗口,怎么实现,代码有有关问题.比较急多谢

热度:366   发布时间:2016-04-24 02:26:29.0
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之类。