2014-02-27 45 views
0

我的代碼是這樣的,當我運行它時我只是得到一個黑色的窗口,我不知道爲什麼。爲什麼我的JFrame只是一個黑色的窗口?

感謝您的任何反饋意見。它應該打印出一張圖片,並最終讓它移動。

package assignment04; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GoLDriver 
{ 
    public static void main(String[] args) 
    { 
     GoLModel model= new GoLModel(); 
     JFrame frame = new JFrame(); 
     JPanel panel= new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     panel.setPreferredSize(new Dimension(400, 300)); 
     model.initialize(); 
     frame.add(panel); 
     frame.pack(); 
     frame.setTitle("Game of Life"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     GoLComponent component = new GoLComponent(model,15,20,20); 
     panel.add(component); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     for(int i=0; i <40; i++) 
     { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      model.count(); 
      model.update(); 
      panel.repaint(); 
     } 
    } 
} 

回答

4

這最可能的原因是你塊中的事件指派線程,防止它畫...

for(int i=0; i <40; i++) 
{ 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    model.count(); 
    model.update(); 
    panel.repaint(); 
} 

Concurrency in SwingHow to use SwingTimer看一看,然後做一個搜索animation in swing在谷歌更多的建議...

0

我強烈建議不要使用Java的swing框架在靜態主要方法中進行編碼。

一個更好的佈局(但不會解決你的問題)是:

public class GoLDriver 
{  
    private GoLModel model; 
    private JFrame frame; 
    private JPanel panel; 
    private GoLComponent component; 

    public GoLDriver() { 
     model= new GoLModel(); 
     frame = new JFrame(); 
     panel= new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     panel.setPreferredSize(new Dimension(400, 300)); 
     model.initialize(); 
     frame.add(panel); 
     frame.pack(); 
     frame.setTitle("Game of Life"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     component = new GoLComponent(model,15,20,20); 
     panel.add(component); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public void startDriver() { 
     for(int i=0; i <40; i++) 
     { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      model.count(); 
      model.update(); 
      panel.repaint(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     GoLDriver gld = new GoLDriver(); 

     gld.startDriver(); 
    } 
} 

鑑於這種看起來像一類的編碼分配,而不是進一步的回答,我建議你看鏈接MadProgrammer張貼。這個重構將幫助應用這些鏈接中的課程更容易練習。

基本經驗法則是,不要將您的處理代碼放在與顯示代碼相同的線程中。否則,處理代碼將阻止顯示代碼(事件分派線程)像通常那樣工作。更好地利用SpringTimer/events模型,或者創建一個新的線程來處理處理代碼。有關在Java中使用線程的基礎知識,請參閱concurrency lesson

+1

我也推薦[初始線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) – MadProgrammer

相關問題