2013-07-21 54 views
3

我正在學習使用緩衝區策略與畫布,我編寫了這個類,然後將其添加到另一個類的JFrame中。 我想繪製一個矩形,但畫布是空的。控制檯說Java緩衝區策略學習

at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source) 
at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source) 
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source) 
at java.awt.Component.createBufferStrategy(Unknown Source) 
at java.awt.Canvas.createBufferStrategy(Unknown Source) 
at java.awt.Component.createBufferStrategy(Unknown Source) 
at java.awt.Canvas.createBufferStrategy(Unknown Source) 
at myPanel.draw(Pannello.java:72) 
at myPanel.run(Pannello.java:59) 
at java.lang.Thread.run(Unknown Source) 

而這裏的代碼。我已經對它進行了調試,並將其應用到我製作的每種方法中。所以現在基本上我不知道爲什麼它沒有顯示我的矩形。

public class myPanel extends Canvas implements Runnable { 

    //FIELDS 
    private static final long serialVersionUID = 1L; 
    public static int WIDTH = 1024; 
    public static int HEIGHT = WIDTH/16 * 9; 
    private boolean running; 
    private Thread t1; 





    public synchronized void start(){ 
     running = true; 
     t1 = new Thread (this); 
     t1.start(); // calls run() 

     } 


    //INIT 
    public myPanel(){ 

     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setFocusable(true); 
     requestFocus(); 
    } 


    //Main runnable 

    public void run(){ 
     while (running){ 
      update(); 
      draw(); 
     } 
    } 


    public void update(){ 

    } 


    public void draw(){ 
     BufferStrategy bs = getBufferStrategy(); 
     if (bs== null){ 
     createBufferStrategy(3); 
     } 

     Graphics g = bs.getDrawGraphics(); 
     g.setColor(Color.BLACK); 
     g.fillOval(0, 0, 20, 20); 
     g.dispose(); 
     bs.show(); 
    } 

}

+0

你可以請你展示你的JFrame類嗎? –

回答

4

這是我最初的回答,這應該解決您的問題。我會在我的下一個編輯中解釋你的錯誤:

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 

import javax.swing.JFrame; 

public class myPanel extends Canvas implements Runnable { 

//FIELDS 
private static final long serialVersionUID = 1L; 
public static int WIDTH = 1024; 
public static int HEIGHT = WIDTH/16 * 9; 
private JFrame frame; 
private boolean running; 
private Thread t1; 


public myPanel(){ 
    Dimension size = new Dimension(WIDTH, HEIGHT); 

    setPreferredSize(size); 

    frame = new JFrame(); 
} 


public synchronized void start(){ 
    running = true; 
    t1 = new Thread (this); 
    t1.start(); // calls run() 
} 


//Main runnable 

public void run(){ 
    while (running){ 
     update(); 
     draw(); 
    } 
} 


public void update(){ 

} 


public void draw(){ 
    BufferStrategy bs = getBufferStrategy(); 
    if (bs== null){ 
    createBufferStrategy(3); 
    return; 
    } 

    Graphics g = bs.getDrawGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillOval(0, 0, 20, 20); 
    g.dispose(); 
    bs.show(); 
} 

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

    myPanel.frame.setResizable(false); 
    myPanel.frame.setTitle("My frame"); 
    myPanel.frame.add(myPanel); 
    myPanel.frame.pack(); 
    myPanel.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    myPanel.frame.setLocationRelativeTo(null); 
    myPanel.frame.setVisible(true); 

    myPanel.start(); 
} 
} 

好的,首先,在Java中使用你的類名是大寫。我沒有在這裏做,但我希望你會記得。

其次,你的代碼中缺少一些東西。你沒有創建一個JFrame,並且沒有一個主要的方法,我相信你知道每個Java程序都需要知道從哪裏開始。您還需要一個構造函數來初始化JFrame並設置框架的大小。

三,創建緩衝策略後需要return;

我希望這有助於。

編輯:

不是添加new myPanel()到相框,加game代替。 frame.add(game);

+0

好的,請參閱上文。我在發帖時回答。 – Muteking

+0

就是這樣。謝謝。 – Muteking

+0

很高興我幫忙;) –

0

在框架初始化,你的情況:

public myPanel() {...} 

您需要調用方法 「frame.addNotify()」,例如:

public myPanel() { 
    Dimension size = new Dimension(WIDTH, HEIGHT); 
    setPreferredSize(size); 
    frame = new JFrame(); 
    frame.addNotify(); 
} 

再後來了你的代碼,要包括代碼:

@Override 
public void addNotify() { 
    super.addNotify(); 
} 

這只是通知FR你希望這個類使用緩衝區。 你在做什麼是試圖讓幀使用緩衝區來創建一個圖形類型緩衝策略,當幀不知道哪個組件的緩衝區用於請求的任務。