2013-02-12 92 views
1

为了大家了解我的问题,我创建了一个简单的GUI程序来显示我的问题。我会先把你的代码分析一下。然后,请观看下面的视频,看看我有什么意思要问。请耐心等待,视频只需几秒钟,而且不会花费时间加载。我怎样才能防止我的JFrame窗口倍增?

菜单的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(); 
     }  
    } 

如果your're想知道什么是 “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

请参阅[使用多个JFrames,好/坏实践?](http://stackoverflow.com/a/9554657/418556) – 2013-02-12 11:47:31

+0

谢谢Mr. @AndrewThompson!有你的帮助想法! *如果有任何更多的想法,我仍然对他们开放... – 2013-02-12 12:01:33

+0

问题是你继续添加actionlistener对象的按钮,所以它堆栈,导致多个执行代码'actionPerformed ' – Bnrdo 2013-02-14 07:46:29

回答

1

这两个类都是JFrame的一个子类,它会产生一个新窗口。

一个名为Menu的按钮包含一个按钮“clickMe”,该按钮实例化SubMenu,该按钮包含一个实例化Menu的按钮“clickMe2”。这会创建一个无限循环,创建每个类的更多实例。即创造更多的框架。

在类子菜单,删除这些行:

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

开始使用摆动开始,Oracle具有很大的教程。

1

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

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

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

;

相关问题