我正在开发的程序包含一个名为 GameForm
的类,它扩展了 JFrame
。该表单将包含一张 map (只是一系列矩形)以及 map 上的某些对象。
但是,我无法使用单个 paintComponent(Graphics g)
函数绘制所有这些对象,因为并非游戏中的所有对象都必须同时绘制。例如,drawMap()
函数仅在表单首次加载时调用,而所有其他绘图函数将在每次加载后调用。
但是,根据我所读到的内容(如果我错了,请纠正我),类中只允许有一个 paintComponent
函数,其他函数不能使用其 Graphics2D
对象。
对于如何实现这一点有什么想法吗?
最佳答案
刚接触 Swing/GUI 编程的人经常将 JFrames
想象成绘图表面或纸张。但是,您必须习惯事实并非如此。
首先,GUI 程序有某种 EDT(事件调度线程)。该线程是所有 GUI 操作发生的地方。更新 GUI 并响应用户输入发生在这里。这是必要的,因为用户交互和 GUI 的编程更改需要很好地同步。
回到主题,JFrame
基本上只是一个注册到系统作为“绘图表面”的矩形。系统会要求您在其上进行绘制,而不是仅仅在其上进行绘制。
这就是 paintComponent(Graphics)
的用处。显然,你不想一直画画。它的工作原理如下:
- 用户打开您的窗口
- 系统告诉您的应用:“嘿,您想要这个表面,请绘制它”
- 来自
paintComponent()
的 Graphics 用于(快速)重新绘制框架 - 您的应用程序将保持非 Activity 状态,直到用户进行下一个输入
如果你想为你的框架设置动画,你必须像这样工作:
- 告诉系统:“嘿,我想重新绘制我的表面”(调用
repaint()
) - 系统调用
paintComponent()
并重新绘制你的东西 - 下一次通话必须延迟
- 重新开始,绘制下一个图像
请注意,延迟很重要,因为所有这些都发生在神圣的 EDT 上。 EDT 处理所有事情并需要“呼吸”,以便用户可以在您制作动画时做一些事情。
总而言之,您学到的是:
- 将绘制所需的所有状态保存在变量中。
- 当调用
paintComponent()
时,在表面上绘制 - 如果您想要动画,请调用
repaint()
-> 将调用paintComponent()
- 切勿阻止 EDT
最后要考虑的事情:不要使用 JFrame
直接绘制。
相反,将 JPanel
添加到框架并重写其 paintComponent()
方法。
关于java - Java中的多种2D图形绘制函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25574261/