使用 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 绘图函数 )