java - Java中的多种2D图形绘制函数

标签 java swing graphics2d

我正在开发的程序包含一个名为 GameForm 的类,它扩展了 JFrame。该表单将包含一张 map (只是一系列矩形)以及 map 上的某些对象。

但是,我无法使用单个 paintComponent(Graphics g) 函数绘制所有这些对象,因为并非游戏中的所有对象都必须同时绘制。例如,drawMap() 函数仅在表单首次加载时调用,而所有其他绘图函数将在每次加载后调用。

但是,根据我所读到的内容(如果我错了,请纠正我),类中只允许有一个 paintComponent 函数,其他函数不能使用其 Graphics2D 对象。

对于如何实现这一点有什么想法吗?

最佳答案

刚接触 Swing/GUI 编程的人经常将 JFrames 想象成绘图表面或纸张。但是,您必须习惯事实并非如此。

首先,GUI 程序有某种 EDT(事件调度线程)。该线程是所有 GUI 操作发生的地方。更新 GUI 并响应用户输入发生在这里。这是必要的,因为用户交互和 GUI 的编程更改需要很好地同步。

回到主题,JFrame 基本上只是一个注册到系统作为“绘图表面”的矩形。系统会要求您在其上进行绘制,而不是仅仅在其上进行绘制。

这就是 paintComponent(Graphics) 的用处。显然,你不想一直画画。它的工作原理如下:

  1. 用户打开您的窗口
  2. 系统告诉您的应用:“嘿,您想要这个表面,请绘制它”
  3. 来自 paintComponent() 的 Graphics 用于(快速)重新绘制框架
  4. 您的应用程序将保持非 Activity 状态,直到用户进行下一个输入

如果你想为你的框架设置动画,你必须像这样工作:

  1. 告诉系统:“嘿,我想重新绘制我的表面”(调用repaint())
  2. 系统调用paintComponent()并重新绘制你的东西
  3. 下一次通话必须延迟
  4. 重新开始,绘制下一个图像

请注意,延迟很重要,因为所有这些都发生在神圣的 EDT 上。 EDT 处理所有事情并需要“呼吸”,以便用户可以在您制作动画时做一些事情。

总而言之,您学到的是:

  1. 将绘制所需的所有状态保存在变量中。
  2. 当调用 paintComponent() 时,在表面上绘制
  3. 如果您想要动画,请调用 repaint() -> 将调用 paintComponent()
  4. 切勿阻止 EDT

最后要考虑的事情:不要使用 JFrame 直接绘制
相反,将 JPanel 添加到框架并重写其 paintComponent() 方法。

关于java - Java中的多种2D图形绘制函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25574261/

相关文章:

使用Picasso时出现java.lang.NoSuchMethodError

java - 在 Java Android 应用程序中打开最后一个 fragment View

用于不扩展 jpanel 或其他东西的类的 Java KeyListener

java - 添加滚动条和图像大小调整问题

java - 显示矩形位置有 0.01 的差异?

java - 应用程序的小部件、服务和模型(单例)之间的通信(类似 MVC 的架构)

java - 检测链表中的循环 - 指针何时相遇?如何通过交集找到循环的头部?

java - 将自定义对象从 JList 拖放到 JLabel

java - Graphics2D 在绘制之前获取 String 的尺寸

java gui图形问题