2013-07-21 53 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你希望这个类使用缓冲区。 你在做什么是试图让帧使用缓冲区来创建一个图形类型缓冲策略,当帧不知道哪个组件的缓冲区用于请求的任务。