2015-08-29 91 views
1

我想從一個擴展JPanel的類創建一個對象,但是當我運行它時,我得到一個StackOverflowError。 錯誤消息: 「異常在線程 」主「 java.lang.StackOverflowError的」從JPanel類創建一個對象給溢出錯誤

Main.java

public class Main { 

public static int width = 600, height = 400; 
public static String title = "tec9meister"; 

public static void createWindow(){ 
    JFrame frame = new JFrame(title); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setSize(width, height); 
    frame.setResizable(false); 

    //createPane(frame); 

    PaintPanel p = new PaintPanel(); 
    p.setSize(100,100); 
    frame.add(p); 

    frame.setVisible(true); 
} 

private static void createPane(JFrame frame) { 
    PaintPanel pane = new PaintPanel(); 

    pane.setSize(width, height); 
    pane.setFocusable(true); 
    pane.requestFocus(); 

    frame.add(pane); 
} 

public static void main(String[] args) { 
    createWindow(); 
} 
} 

PaintPanel.java

public class PaintPanel extends JPanel{ 

public PaintPanel() { 

    Target t = new Target(100, 100, 10, 10); 

} 
} 

Target.java

public class Target extends PaintPanel { 

private int x; 
private int y; 
private int width; 
private int height; 

public Target(int x, int y, int width, int height) { 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 

} 
+1

請_full_類'PaintPanel'和'TestClass'。你明確地調用了一些沒有顯示的方法,並且我非常肯定那些或者'TestClass'必須是拋出'StackOverflowError'的地方。另外,在哪裏使用了「目標」? – bcsb1001

+2

請向我們展示'TestClass'代碼。 – Emd4600

回答

1

如果您嘗試創建一個在PaintPanel的構造函數中擴展PaintPanel的類的實例,由於遞歸調用相同的構造函數,這將導致StackOverflowError。特別是,TestClass不能是Target,因爲Target擴展了PaintPanel。

+0

謝謝,我只是提出了創建對象的方法,並從Main類中調用它,現在一切正常。 –

-1

你應該總是在Event Dispatch Thread運行Swing程序,使用這樣的:

EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     try { 
      createWindow(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

如果不解決這個問題,嘗試添加JPanel到幀的contentPane

frame.getContentPane().add(panel); 
+1

這些事情顯然不能導致'StackOverflowError',所以不能成爲解決方案或答案。沒有使用'Thread'的OP的證據,所以沒有必要以這種方式運行Swing程序。 – bcsb1001

+0

我被告知總是使用事件派發線程,即使沒有任何其他線程。所以在這些情況下沒有必要? – Emd4600

+0

這可能被認爲是一種很好的做法,因爲當你使用線程時忘記使用它是很難的,但是在我知道'EventQueue'沒有任何問題之前我寫了很多工作的Swing程序(直到我嘗試了線程,遇到意想不到的行爲,並看着這個)。 – bcsb1001