使用Canvas在Java中绘图

时间:2012-03-08 03:58:35

标签: java swing graphics canvas awt

我想用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是我的铅笔,我错了吗?那是怎么回事?

4 个答案:

答案 0 :(得分:36)

建议:

  • 不要使用Canvas,因为您不应该不必要地将AWT与Swing组件混合使用。
  • 而是使用JPanel或JComponent。
  • 不要通过调用组件上的getGraphics()来获取Graphics对象,因为获得的Graphics对象将是瞬态的。
  • 使用JPanel的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();
    }
}