2011-10-03 78 views
3

所以,我一直在努力重做我的代碼,以便所有的繪畫都在JPanel而不是JFrame中完成,所以我可以做一些非常需要的圖像緩衝。在JFrame中設置JPanel?

我已經搜刮了StackOverflow,並且我用我的手指編制了原始圖片,並且我認爲我已將它設置正確,但它不起作用。我只是在終端上看到一個空白的白屏和一些錯誤腳本。任何幫助表示讚賞。下面是代碼

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.awt.geom.*; 

public class RacerDoom extends JFrame { 
    private JPanel panel; 
    final int WIDTH = 900, HEIGHT = 640; 
    int counter = 0; 
    Rectangle left = new Rectangle(0,0,WIDTH/9,HEIGHT); 
    Rectangle right = new Rectangle((WIDTH/9)*8,0,WIDTH/9,HEIGHT); 
    Rectangle top = new Rectangle(0,0,WIDTH,HEIGHT/9); 
    Rectangle bottom = new Rectangle(0,(HEIGHT/9)*8,WIDTH,HEIGHT); 
    Rectangle center = new Rectangle((int)((WIDTH/9)*2.5),(int)((HEIGHT/9)*2.5),(int)((WIDTH/9)*4),(HEIGHT/9)*4); 
    Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30); 
    Rectangle finishtop = new Rectangle(WIDTH/9,(HEIGHT/2)-HEIGHT/9,(int)((WIDTH/9)*1.5),HEIGHT/70); 
    //Starting lines 
    Rectangle startO = new Rectangle(WIDTH/9,HEIGHT/2,(int)((WIDTH/9)*1.5)/2,HEIGHT/140); 
    public RacerDoom() { 
     //create JFrame 
     super("Racer Doom Squared"); 
     setSize(WIDTH,HEIGHT); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     getContentPane().add(panel); 

     panel = new MainPanel(); 
     panel.setBounds(0,0,WIDTH,HEIGHT); 

     this.getContentPane().add(panel); 
     //set up Game countdown timer 
     final Timer timer=new Timer(1000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(counter>=10) { 
        ((Timer)e.getSource()).stop(); 
       } 
       else{ 
        counter++; 
        } 
       System.out.println(counter); 
      } 
     }); 

     //start timer 
     timer.start(); 
    } 
    private class MainPanel extends JPanel { 
     public MainPanel() { 
      super(); 
     } 
    //draw graphics 
     @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(0,0,WIDTH,HEIGHT); 
     //boundaries 
     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(left.x,left.y,left.width,left.height); 
     g.fillRect(right.x,right.y,right.width,right.height); 
     g.fillRect(top.x,top.y,top.width,top.height); 
     g.fillRect(bottom.x,bottom.y,bottom.width,bottom.height); 
     g.fillRect(center.x,center.y,center.width,center.height); 
     //start line 
     g.setColor(Color.WHITE); 
     g.fillRect(startO.x,startO.y,startO.width,startO.height); 
     //finish line 
     g.setColor(Color.CYAN); 
     g.fillRect(finishtop.x,finishtop.y,finishtop.width,finishtop.height); 
     //p1 
     g.setColor(Color.BLUE); 
     g.fill3DRect(p1.x,p1.y,p1.width,p1.height,true); 
     //HUD 
     g.setColor(Color.WHITE); 
     Font f = new Font("Monospaced", Font.BOLD, 24); 
     g.setFont(f); 
     g.drawString("Boosts: "+p1Boost,(WIDTH-(WIDTH/6)),(HEIGHT-(int)(HEIGHT/1.1))); 
     g.drawString("Time: "+(10-counter),540,100); 
    } 
    } 

    public static void main (String [] args) { 

     new RacerDoom(); 
    } 
} 

錯誤的腳本:螺紋

異常 「主」 顯示java.lang.NullPointerException

在java.awt.Container.addImpl(來源不明)

(Racer Doom.java:46)(Unknown Source)

在RacerDoom.main(RacerDoom.java:232)

我確信我只是一個白癡,答案很可能是給我的錯誤信息中指,但它仍然是希臘語給我。但即使(特別是?)白癡也需要幫助。

+2

這不是「一些錯誤的腳本」 ,這是一個NullPointerException。看看這條線,並試圖找出爲什麼其中一個變量爲空。這不是火箭科學,但涉及弄髒你的手指。檢查該行上使用的所有變量(哪一行是?),並首先查看哪些爲空。 –

+0

我的歉意。我應該在發佈之前在網上搜索錯誤的含義。 – Speakr

+0

這就是我正在做的。當你每週工作60個小時以上時,傳統上很難「學習」。我通過閱讀書籍和尋求網上社區問題的幫助來學習。這與尋求老師幫助的學生沒有什麼不同,我只是沒有課堂的好處。但在這裏爭論是不恰當的。謝謝你的幫助。 – Speakr

回答

6

你的錯誤相當簡單:

getContentPane().add(panel); 

panel = new MainPanel(); 
panel.setBounds(0,0,WIDTH,HEIGHT); 

要添加的面板其實之前創建面板寡婦。嘗試重新安排這樣的:

panel = new MainPanel(); 
panel.setBounds(0,0,WIDTH,HEIGHT); 
getContentPane().add(panel); 
1

我相信46行是:

getContentPane().add(panel); 

在這一點上,您尚未創建面板還,所以它是空的。你can't add a null component to a container。刪除該行;你以後的this.getContentPane().add(panel);是你需要的。

1

的NullPointerException異常的發生是因爲你嘗試添加未初始化變量面板:

getContentPane().add(panel); 

你必須先初始化這個變量,而不是將它添加到的getContentPane()