使用 Canvas 在 Java 中绘图

Posted

技术标签:

【中文标题】使用 Canvas 在 Java 中绘图【英文标题】:Drawing in Java using Canvas 【发布时间】:2012-03-25 15:24:56 【问题描述】:

我想在 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 是我的铅笔,我错了吗?是这样的吗?

【问题讨论】:

你只是想画图形吗? 【参考方案1】:

建议:

不要使用 Canvas,因为您不应该将 AWT 与 Swing 组件不必要地混合。 改为使用 JPanel 或 JComponent。 不要通过在组件上调用 getGraphics() 来获取您的 Graphics 对象,因为获取的 Graphics 对象将是瞬态的。 在 JPanel 的paintComponent() 方法中绘制。 所有这些都在几个很容易找到的教程中得到了很好的解释。为什么不在尝试猜测这些内容之前先阅读它们?

主要教程链接:

基础教程:Lesson: Performing Custom Painting 更多高级信息:Painting in AWT and Swing

【讨论】:

谢谢!我确实在网上搜索过。是的,它们很容易找到,但不容易理解。 希望我能对每一点投赞成票,但似乎首先不使用 Canvas for Swing 占了很大的比重。 好点。但请记住,人们在搜索此主题时也会找到您的答案。这就是为什么我认为您应该包含指向您提到的教程的链接。 您对 我想在 Java 的 Canvas 中绘制但由于我不知道自己在做什么而无法工作。 的强度表示赞同。 .【参考方案2】:

您必须覆盖 Canvas 的 paint(Graphics g) 方法并在那里执行绘图。见the paint() documentation.

正如它所说,默认操作是清除画布,因此您对画布图形对象的调用不会像您预期的那样执行。

【讨论】:

【参考方案3】:

为什么第一种方法行不通。创建画布对象并设置大小和设置图形。我总觉得这很奇怪。此外,如果一个类扩展了 JComponent,您可以覆盖

paintComponent()
  super...

然后你不应该能够在另一个类中创建类的实例然后调用NewlycreateinstanceOfAnyClass.repaint();

我已经为我一直在工作的一些游戏编程尝试了这种方法,但它似乎并不像我认为的那样工作。

道格·豪夫

【讨论】:

【参考方案4】:

以下应该有效:

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();
    

【讨论】:

以上是关于使用 Canvas 在 Java 中绘图的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ② ( AWT 绘图步骤 | Graphics 绘图常用 API )

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ③ ( 绘图步骤 | 绘图案例 )

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ③ ( 绘图步骤 | 绘图案例 )

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ④ ( AWT 绘图窗口闪烁问题 )

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ④ ( AWT 绘图窗口闪烁问题 )

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ① ( AWT 绘图线程 | Component 绘图函数 )