java - 程序中的各种 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);
}
}
}
解决方案
这里的问题是我们对 bt1 使用了静态修饰符。使用 static 关键字,我们在第一次frame
调用构造函数时创建一个新按钮。在对构造函数的每次后续调用中,不会创建frame
新按钮。而是 static 关键字导致按钮仅在第一次调用时创建一次。
每次创建新的 JFrame 时,它实际上对每个 JFrame 使用相同的按钮。这反过来会导致您看到的行为。
当您创建第一个框架时,它会附加 bt1。当您单击下一步时,它将创建第二个框架,并附有相同的bt1。更重要的是,当您调用此构造函数时,您创建了一个新的 ActionListener 并将其附加到同一个按钮。因此,每次调用此构造函数时,都会将另一个侦听器添加到在所有帧中使用的同一个按钮对象。
问题的根源在于,对于每个构造函数,我们都在向同一个按钮添加一个新的 ActionListener。
我相信您可以通过以下两种方式之一解决此问题。
- 使 bt1 非静态,这样每个框架对象都有自己唯一的按钮
- 使框架构造函数中的 actionListener 成为静态的。在这种情况下,所有框架都将使用相同的按钮。并且所有按钮都将使用相同的(和单一的)actionListener。
推荐阅读
- python - 如何修复 django 两工厂身份验证设置?
- linux - iptables 命令返回“没有该名称的链/目标/匹配”。
- r - 如何将 ggpubr 图添加到另一个图中?
- python - 微调 mnist 的深度自动编码器模型
- docker - Kubernetes - 私有存储库部署问题
- python - 如何在 python 列表中搜索多个元素?
- r - RegEx 用于在大写字母前添加下划线
- regex - 如何使用正则表达式根据python中的国际来电显示空间状态来电显示和电话号码格式化电话号码?
- python - 使用索引将二进制字符串转换为整数数组
- c# - 从 C# 委托在运行时调用 C++ 方法