Java 程序中的各种jframe

Java 程序中的各种jframe,java,swing,jframe,Java,Swing,Jframe,在程序中,我想在按下按钮时打开许多帧。 每次按下按钮时,我都会创建一个帧实例,并使用“setVisible”方法使其可见,但每次按下按钮时,帧都以指数形式生成 也就是说,如果我有2个打开的帧,我按下按钮,4个打开,如果我再次按下,他们打开8个等等 这是我的密码 public class ex { public static void main(String[] args) { frame fr = new frame (); fr.setVisible

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

也就是说,如果我有2个打开的帧,我按下按钮,4个打开,如果我再次按下,他们打开8个等等

这是我的密码

public class ex {

    public static void main(String[] args) {

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

    }

}



这里的问题是,我们正在为bt1使用静态修饰符。使用static关键字,我们在第一次调用
frame
构造函数时创建一个新按钮。在对
frame
构造函数的每次子量化调用中,都会创建一个新按钮而不是。相反,static关键字只会在第一次调用时创建一次按钮

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

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

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

我相信你可以用两种方法中的一种来解决这个问题

  • 使bt1非静态,以便每个帧对象都有自己的唯一按钮
  • 将框架构造函数中的actionListener设置为静态。在这种情况下,所有帧将使用相同的按钮。所有按钮都将使用相同的(单数)actionListener

  • 1) 为什么要打开多个
    JFrame
    s?他们创造了一个可怕的用户体验,见(坏)。2) 遵循,即
    firstWordLowerCaseVariable
    firstWordLowerCaseMethod()
    FirstWordUpperCaseClass
    所有单词大写常量
    ,它们应该有有意义的名称(
    AL
    在较长的程序中对我来说没有任何意义)。3)为什么要为
    JFrame
    使用静态变量?4) 不要直接扩展
    JFrame
    。5) 为什么在方法声明和方法体之间留有如此多的空间,并且在最后也留有如此多的空间,在大括号
    {}
    之后或之前不需要额外的空间。6) 您的问题与第3点有关,关于您使用
    静态
    变量跟踪已打开的窗口数。你应该有一个共享模型来跟踪@Frakcool——我同意这种说法。一般来说,这是一种不好的做法,但我不知道用户场景的整个上下文。所以我不能肯定这是一个好的还是坏的选择@Elias意识到使用static关键字可能是危险的,应谨慎使用。
    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);
            }
        }
    }