2016-09-09 1 views
0

Ich bin ein Anfänger-Programmierer, der versucht, das HangMan-Spiel zu erstellen.Einen Stackoverflow-Fehler beim Senden der Instanz der Hauptklasse an eine andere Klasse erhalten

Also habe ich eine Main-Klasse (Main JFrame), die verschiedene andere Panel-Klassen instanziiert. Ein solches Panel ist , das im Grunde ein Panel mit JButtons ist. Ich habe eine checkwithKey() Methode in der Hauptklasse und ich muss das in der Klasse (für die ActionListener Klasse der JButtons) nennen. Dafür habe ich in MainClass eine getInstance() Methode erstellt und diese in der Klasse aufgerufen. Wenn ich es ausführe, erhalte ich den Stackoverflow-Fehler.

Unten finden Sie den Code-Schnipsel von Mainframe-Klasse:

//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 
    } 

    } 

Unten sind die Code-Schnipsel KeyboardPanel Klasse

//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 
     } 
     } 

    } 

Kann mir jemand helfen mit diesem?

Stacktrace:

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

die stacktrace please – Jens

Antwort

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

In der Zeile 3) der Großrechner ist noch nicht instanziiert. Als Ergebnis

if(mf==null) 

gibt True zurück. Und dann versucht es, noch einmal instanziiert zu werden. Das Hauptproblem liegt also in der Verwendung Ihrer Klassen. Sie sind während der Initialisierungsphase verkettet.

Ich denke, es gibt Gründe, KeyboardPanel Klasse als Singleton zu verwenden. Es macht nur Sinn mit MainFrame. Hier ist die kürzeste Lösung in Ihrem Fall:

//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

Oh ich es jetzt .... So können Sie mir einen besseren Ansatz bitte schlagen die Hauptklassenmethode in die andere Klasse zu nennen. Und auch danke für die schnelle Antwort. – ArCh3r

+0

@ ArCh3r Warum haben Sie sich dazu entschieden, KeyboardPanel zu einem Singleton zu machen? –

+0

Ich hatte keinen Grund, diesen Singleton zu machen. Ich kopierte tatsächlich den Code von einem anderen Panel, das ich gemacht habe, das ein Singleton ist. Ich werde versuchen, das Singleton für die Tastaturklasse zu entfernen. – ArCh3r

Verwandte Themen