为了让大家理解我的问题,我创建了一个简单的GUI程序来显示我的问题。我会先把代码放出来让你分析。然后,请看下面的视频,看看我想问什么。请耐心等待,视频只有几秒钟,不需要时间加载。
菜单JFrame:
//This is a Menu JFrame Window
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Menu extends JFrame implements GlobalVariables{
public Menu(){
clickMe.setBounds(75, 50, 100, 50);
clickMe.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
dispose();
SubMenu sm = new SubMenu();
sm.subMenuProperties();
}
});
add(clickMe);
}
void menuProperties(){
setLayout(null);
setSize(250,175);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Menu m = new Menu();
m.menuProperties();
}
}
子菜单JFrame:
//This is a SubMenu JFrame Window
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class SubMenu extends JFrame implements GlobalVariables{
public SubMenu(){
clickMe2.setBounds(75, 50, 100, 50);
clickMe2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
dispose();
Menu m = new Menu();
m.menuProperties();
}
});
add(clickMe2);
}
void subMenuProperties(){
setLayout(null);
setSize(250,175);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SubMenu sm = new SubMenu();
sm.subMenuProperties();
}
}
如果你想知道什么是"GlobalVariables"实现,这里是:
import javax.swing.*;
public interface GlobalVariables{
//Menu Variable
JButton clickMe = new JButton("SubMenu");
//SubMenu Variable
JButton clickMe2 = new JButton("Back");
}
现在,这个视频将向您展示我在JFrame中的意思:
http://www.youtube.com/watch?v=iCavg_1SqvY
*如果你看了视频,你可以明白我说的JFrame是相乘的意思。我已经分析了好几天了,但我无法确定我的错误。如果你能准确地指出我的错误,我将不胜感激。我也对代码中的注释和调整持开放态度,我只希望代码的结构不会被重新结构化,因为正如我之前所说,我创建这个简单的GUI只是为了向您展示我的问题,但至少要告诉您,在GUI制作中,我有一个完整的程序正在等待使用这种方法完成。请帮帮我。
这两个类都是JFrame的子类,这会产生一个新窗口。
一个名为Menu的按钮包含一个实例化SubMenu的按钮"clickMe",其中包含一个初始化Menu的按钮"clickMe2"。这会创建一个无休止的循环,为每个类创建更多的实例。即创建更多的框架。
在类SubMenu中,删除以下行:
Menu m = new Menu();
m.menuProperties();
为了开始使用swing,Oracle提供了很棒的教程。
我发现了代码的问题。您需要删除actionPerformed方法中的ActionListener。对于每次单击按钮,您的代码都会创建一个新的ActionListener对象,并将其与您的按钮关联起来。后续的点击会被这个重复的动作监听器执行,您最终会得到更多的JFrame。
将以下行添加到dispose()行之后的两个类的actionPerformed(ActionEvent e)方法中。这应该可以解决你的问题
Menu.java
clickMe.removeActionListener(this);
......
SubMenu.java
clickMe2.removeActionListener(this)