首页 > 解决方案 > 程序中的各种 JFrame

问题描述

在程序中,我想在按下按钮时打开许多帧。每次我按下按钮时,我都会创建一个框架实例并使用“setVisible”方法使其可见,但每次按下按钮时,框架都会以指数方式生成。

也就是说,如果我有 2 个打开的框架并且我按下按钮,则会打开另外 4 个,如果我再次按下它,它们会打开 8 个等等。

这是我的代码

public class ex {

    public static void main(String[] args) {

        frame fr = new frame ();
        fr.setVisible(true);

    }

}

public class frame extends JFrame{

    static int i=1;
    static JButton bt1 = new JButton("Next");

    public frame () {
        super ("Example"+i);
        setSize(600,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocation(400,200);
        setResizable(false);
        setLayout(new GridLayout(2,1));

        JLabel et1 = new JLabel("frame"+i);

        this.add(et1);
        this.add(bt1);

        AL actionListener = new AL ();
        bt1.addActionListener(actionListener);

    }
}

import java.awt.event.*;

public class AL implements ActionListener{

    public void actionPerformed (ActionEvent e) {

        if(e.getSource()==frame.bt1) {
            frame.i++;
            frame fr = new frame ();
            fr.setVisible(true);
        }
    }
}

标签: javaswingjframe

解决方案


这里的问题是我们对 bt1 使用了静态修饰符。使用 static 关键字,我们在第一次frame调用构造函数时创建一个新按钮。在对构造函数的每次后续调用中,不会创建frame新按钮。而是 static 关键字导致按钮仅在第一次调用时创建一次。

每次创建新的 JFrame 时,它​​实际上对每个 JFrame 使用相同的按钮。这反过来会导致您看到的行为。

当您创建第一个框架时,它会附加 bt1。当您单击下一步时,它将创建第二个框架,并附有相同的bt1。更重要的是,当您调用此构造函数时,您创建了一个新的 ActionListener 并将其附加到同一个按钮。因此,每次调用此构造函数时,都会将另一个侦听器添加到在所有帧中使用的同一个按钮对象。

问题的根源在于,对于每个构造函数,我们都在向同一个按钮添加一个新的 ActionListener。

我相信您可以通过以下两种方式之一解决此问题。

  1. 使 bt1 非静态,这样每个框架对象都有自己唯一的按钮
  2. 使框架构造函数中的 actionListener 成为静态的。在这种情况下,所有框架都将使用相同的按钮。并且所有按钮都将使用相同的(和单一的)actionListener。

推荐阅读