1

何かを試すために書いたコードに少し問題があります。ボタンが1つ入ったフレームを作りました。このボタンをクリックすると、新しいフレームが開きます。新しいフレームを閉じてから、ボタンをもう一度クリックして、まだ機能するかどうかを確認します。問題はここから始まります.1つの新しいフレームを開くのではなく、2つの新しいフレームを開きます. 3 回目にクリックすると、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 に答える