2016-09-09 25 views
0

我是一个尝试构建HangMan游戏的新手程序员。将主类的实例发送到另一个类时获取Stackoverflow错误

所以,我有一个Main类(主JFrame),它实例化不同的其他面板类。一个这样的面板是keyboardPanel,它基本上是一个JButtons面板。我在Main Class中有一个checkwithKey()方法,我需要在keyboardPanel类(用于JButton的ActionListener类)中调用该方法。为此我在MainClass中创建了一个getInstance()方法,并在keyboardPanel类中调用它。当我执行它时,我得到了stackoverflow错误。

下面是MainFrame类的代码片段:

//MainFrame class 
    public class MainFrame extends JFrame { 
    public KeyboardPanel keyboardPanel; 
    private static MainFrame mf; 

    private MainFrame(){ 
    keyboardPanel = KeyboardPanel.getInstance(); 
    add(keyboardPanel);  
    }  

    public static MainFrame getInstance(){ 
    if(mf==null){ 
     mf = new MainFrame(); 
     return mf; 
    } 
    else 
     return mf; 
    } 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       MainFrame frame = MainFrame.getInstance(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 
    protected void checkwithKey(char c){ 
     //Logic 
    } 

    } 

下面是KeyboardPanel类的代码片段

//KeyboardPanel Class 
    public class KeyboardPanel extends JPanel { 
     private static KeyboardPanel kdP; 
     private MainFrame mf = MainFrame.getInstance() ; 

     public static KeyboardPanel getInstance(){ 
     if(kdP == null){ 
      kdP = new KeyboardPanel(); 
      return kdP; 
      } 
      else 
       return kdP; 
     }   

     private KeyboardPanel(){ 
     //JButton Code.. 

     } 

    class KeyAction implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent a) { 
     char c = a.getActionCommand().charAt(0); 
     mf.checkwithKey(c); // I need to call the checkwithkey() from Mainclass here 
     } 
     } 

    } 

谁能帮助我?

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at sun.awt.Win32GraphicsConfig.getBounds(Native Method) 
at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source) 
at java.awt.Window.init(Unknown Source) 
at java.awt.Window.<init>(Unknown Source) 
at java.awt.Frame.<init>(Unknown Source) 
at java.awt.Frame.<init>(Unknown Source) 
at javax.swing.JFrame.<init>(Unknown Source) 
at hangman.MainFrame.<init>(MainFrame.java:119) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
at hangman.MainFrame.<init>(MainFrame.java:134) 
at hangman.MainFrame.getInstance(MainFrame.java:30) 
+0

添加堆栈跟踪,请 – Jens

回答

0
1) MainFrame frame = MainFrame.getInstance(); 
2) keyboardPanel = KeyboardPanel.getInstance(); 
3) private MainFrame mf = MainFrame.getInstance(); 

在第3行)的大型机尚未实例化。因此,

if(mf==null) 

返回true。然后它试图再次实例化。所以主要的问题在于你的类的使用。他们在初始化阶段链接。

我认为有理由使用KeyboardPanel类作为单例。 只有使用MainFrame才有意义。 这是你的情况,最短的解决方案:

//MainFrame class 
public class MainFrame extends JFrame { 
    public KeyboardPanel keyboardPanel; 
    private static MainFrame mf; 

    private MainFrame(){ 
     keyboardPanel = new KeyboardPanel(this); 
     add(keyboardPanel); 
    } 

    public static MainFrame getInstance(){ 
     if(mf==null){ 
      mf = new MainFrame(); 
     } 
     return mf; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        MainFrame frame = MainFrame.getInstance(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
    protected void checkwithKey(char c){ 
     //Logic 
    } 

} 


//KeyboardPanel Class 
public class KeyboardPanel extends JPanel { 

    public KeyboardPanel(MainFrame mf){ 
     this.mf = mf; 
    } 

    class KeyAction implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent a) { 
      char c = a.getActionCommand().charAt(0); 
      mf.checkwithKey(c); // I need to call the checkwithkey() from Mainclass here 
     } 
    } 

} 
+0

噢,我明白现在....所以,可以请你建议我一个更好的方法来调用主类的方法为其他类。也感谢您的快速回复。 – ArCh3r

+0

@ ArCh3r你为什么决定让KeyboardPanel成为单身人士? –

+0

我没有理由做这个单身人士。我实际上正在复制粘贴来自另一个面板的代码,这是我做的一个单例。我将尝试删除键盘类的单例。 – ArCh3r

相关问题