如何防止JFrame窗口倍增



为了让大家理解我的问题,我创建了一个简单的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)

相关内容

  • 没有找到相关文章

最新更新