为了让每个人都能理解我的问题,我创建了一个简单的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();
}
}
SubMenu 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制作中使用这种方法。请帮帮我。
答案 0 :(得分:1)
这两个类都是JFrame的子类,从而产生一个新窗口。
名为Menu的那个包含一个“clickMe”按钮,它实例化SubMenu,其中包含一个实例化Menu的按钮“clickMe2”。这会创建一个无限循环,创建每个类的更多实例。即创建更多帧。
在SubMenu类中,删除以下行:
Menu m = new Menu();
m.menuProperties();
要开始使用swing,Oracle有很棒的教程。
答案 1 :(得分:1)
我发现了代码的问题。您需要在actionPerformed方法中删除ActionListener。对于每个按钮单击,您的代码将创建一个新的ActionListener对象,并与您的按钮相关联。此重复的动作侦听器会执行后续单击,最终会获得更多JFrame。
在行dispose()之后,将以下行添加到两个类的 actionPerformed(ActionEvent e)方法。这应该可以解决您的问题
Menu.java
clickMe.removeActionListener(this);
......
SubMenu.java
clickMe2.removeActionListener(this)