1

对我编写的一些代码有一点问题来尝试一些东西。我做了一个框架,里面有一个按钮。当我单击此按钮时,会打开一个新框架,它应该。我关闭了新框架,然后再次单击该按钮,尝试查看它是否仍然有效。问题从这里开始,打开一个新框架,它打开了两个新框架。第三次单击它会打开 4 帧,依此类推。我已经尝试了很多东西,但遗憾的是似乎找不到它打开更多帧的原因。请帮忙。

package budget;

import java.awt.event.*;
import javax.swing.*;

public class GUI extends JFrame {

    String labelPrefix;
    JButton button;
    JButton button2;
    JLabel label;

    public static void main(String[] args) {
        JFrame f = new GUI();
        f.setExtendedState(f.MAXIMIZED_BOTH);
        f.setVisible(true);
    }

    public GUI() {
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
        p.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        button = new JButton("Click Me");
        label = new JLabel(labelPrefix);
        p.add(button);
        this.setTitle("Try");
        getContentPane().add(p);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        button.addActionListener(new MyActionListener());
    }

    class MyActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            button.addActionListener(this);
            labelPrefix = "Try";
            JFrame f2 = new GUI(label, labelPrefix);
            f2.setExtendedState(f2.MAXIMIZED_BOTH);
            f2.setVisible(true);

        }
    }

    public GUI(JLabel label, String labelPrefix) {
        JPanel p2 = new JPanel();
        button2 = new JButton("Close");
        p2.add(label);
        p2.add(button2);
        this.setTitle("Try");
        getContentPane().add(p2);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        pack();
        button2.addActionListener(new MyActionListener2());
    }

    class MyActionListener2 implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            button2.addActionListener(this);
            dispose();
        }
    }
}
4

2 回答 2

3

很明显,问题出在这里:

button.addActionListener(this);

每次单击按钮时,它都会再次向按钮添加侦听器。

只需删除该行,错误就会消失。将侦听器添加到按钮后,它会一直留在那里。被触发后它不会被“消耗”。

于 2012-10-15T11:20:41.723 回答
0

actionPerformed检查其中状态的第一行MyActionListener

button.addActionListener(this);

该行应删除。

于 2012-10-15T11:24:09.193 回答