【问题标题】:Drawing in Java using Canvas使用 Canvas 在 Java 中绘图
【发布时间】:2023-03-25 11:11:01
【问题描述】:

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

【问题讨论】:

  • 你只是想画图形吗?

标签: java swing graphics canvas awt


【解决方案1】:

建议:

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

主要教程链接:

【讨论】:

  • 谢谢!我确实在网上搜索过。是的,它们很容易找到,但不容易理解。
  • 希望我能对每一点投赞成票,但似乎首先不使用 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 2017-11-20
        • 2013-05-15
        • 2021-08-10
        • 2011-01-23
        相关资源
        最近更新 更多