我想用Java的Canvas绘制,但是无法让它工作,因为我不知道我在做什么。这是我的简单代码:
import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
public class Program
{
public static void main(String[] args)
{
JFrame frmMain = new JFrame();
frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmMain.setSize(400, 400);
Canvas cnvs = new Canvas();
cnvs.setSize(400, 400);
frmMain.add(cnvs);
frmMain.setVisible(true);
Graphics g = cnvs.getGraphics();
g.setColor(new Color(255, 0, 0));
g.drawString("Hello", 200, 200);
}
}
窗口上没有任何内容。
我认为Canvas是纸,而Graphics是我的铅笔,我错了吗?那是怎么回事?
答案 0 :(得分:36)
建议:
getGraphics()
来获取Graphics对象,因为获得的Graphics对象将是瞬态的。paintComponent()
方法绘制。关键教程链接:
答案 1 :(得分:7)
您必须覆盖Canvas的paint(Graphics g)
方法并在那里执行绘图。见the paint() documentation.
正如它所述,默认操作是清除画布,因此您对画布'图形对象的调用不会像您期望的那样执行。
答案 2 :(得分:1)
为什么第一种方式不起作用。创建Canvas对象并设置大小并设置grahpics。我总觉得这很奇怪。此外,如果类扩展了JComponent,您可以覆盖
paintComponent(){
super...
}
然后你不应该在另一个类中创建类的实例,然后只需调用NewlycreateinstanceOfAnyClass.repaint();
我已经尝试过这种方法来进行一些我一直在工作的游戏编程,它似乎没有像我认为的那样工作。
Doug Hof答案 3 :(得分:1)
以下内容应该有效:
public static void main(String[] args)
{
final String title = "Test Window";
final int width = 1200;
final int height = width / 16 * 9;
//Creating the frame.
JFrame frame = new JFrame(title);
frame.setSize(width, height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
//Creating the canvas.
Canvas canvas = new Canvas();
canvas.setSize(width, height);
canvas.setBackground(Color.BLACK);
canvas.setVisible(true);
canvas.setFocusable(false);
//Putting it all together.
frame.add(canvas);
canvas.createBufferStrategy(3);
boolean running = true;
BufferStrategy bufferStrategy;
Graphics graphics;
while (running) {
bufferStrategy = canvas.getBufferStrategy();
graphics = bufferStrategy.getDrawGraphics();
graphics.clearRect(0, 0, width, height);
graphics.setColor(Color.GREEN);
graphics.drawString("This is some text placed in the top left corner.", 5, 15);
bufferStrategy.show();
graphics.dispose();
}
}