我正在学习使用bufferstrategy和canvas,我编写了这个类,然后将其添加到另一个类的JFrame中。 我正在尝试绘制一个矩形,但画布是空的。控制台说
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 :(得分: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);
答案 1 :(得分:0)
在框架初始化程序中,在您的情况下:
public myPanel() {...}
你需要调用方法&#34; frame.addNotify()&#34; e.g:
public myPanel() {
Dimension size = new Dimension(WIDTH, HEIGHT);
setPreferredSize(size);
frame = new JFrame();
frame.addNotify();
}
然后在您的代码中,您希望包含代码:
@Override
public void addNotify() {
super.addNotify();
}
这只是通知框架你希望这个类使用缓冲区。 当框架不知道哪个组件的缓冲区用于所请求的任务时,你在做什么是试图让框架使用缓冲区来创建图形类型缓冲区策略。