如何防止我的JFrame窗口倍增?

时间:2013-02-12 11:46:34

标签: java swing user-interface jframe dispose

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

2 个答案:

答案 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)