1

为了让每个人都理解我的问题,我创建了一个简单的 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 制作中使用这种方法完成。请帮我。

4

2 回答 2

1

Those two classes are both a subclass of JFrame which results in a new window.

The one named Menu contains a button "clickMe" which instantiates SubMenu that contains a button "clickMe2" that instantiates Menu. This creates a endless loop creating more instances of each class. I.e creating more frames.

In the class SubMenu, remove these lines:

Menu m = new Menu();
m.menuProperties();

To get started using swing, Oracle has great tutorials.

于 2013-02-12T12:36:50.057 回答
1

我发现了代码的问题。您需要在 actionPerformed 方法中删除 ActionListener。对于每个按钮单击,您的代码都会创建一个新的 ActionListener 对象,并与您的按钮相关联。随后的点击被这个重复的动作监听器执行,你最终会得到更多的 JFrame。

在 dispose() 行之后,将以下行添加到两个类的actionPerformed(ActionEvent e)方法中。这应该可以解决您的问题

Menu.java
clickMe.removeActionListener(this);
......
SubMenu.java
clickMe2.removeActionListener(this)

;

于 2013-02-13T00:33:10.240 回答