Java 程序中的各种jframe
在程序中,我想在按下按钮时打开许多帧。 每次按下按钮时,我都会创建一个帧实例,并使用“setVisible”方法使其可见,但每次按下按钮时,帧都以指数形式生成 也就是说,如果我有2个打开的帧,我按下按钮,4个打开,如果我再次按下,他们打开8个等等 这是我的密码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
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
我相信你可以用两种方法中的一种来解决这个问题
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);
}
}
}