覆盖paint()方法
Posted
技术标签:
【中文标题】覆盖paint()方法【英文标题】:Overriding the paint() method 【发布时间】:2016-03-06 07:52:42 【问题描述】:我在这里遇到了一个初学者问题,我希望有一些 Java 经验的人可以帮助我。目前正在学习专注于 Java 的 OOP 课程简介。我的导师目前正在讨论 awt 和 swing,特别是需要覆盖 paint 方法以便在调整窗口大小时重新绘制图形等。我喜欢尽可能多地在户外阅读,我担心的是我的示例教授给出的涉及我读过的东西不是最佳实践。言归正传……
我知道有必要重写paint方法,但我不知道这样做的最佳方法。我教授的例子都类似于以下:
class Example extends JFrame
public void paint(Graphics g)
super.paint(g);
g.drawString("Blah, blah");
public static void main(String[] args)
Example a = new Example();
a.setDefaultCl...
\\Etc...
这让我很困扰,因为将 GUI 的所有内容都包含在与我的 main 方法相同的类中似乎并不正确。另外,我在这里的另一个线程上读到你不应该扩展 JFrame,但没有解释为什么。我的解决方案是创建一个处理 gui 的类并在构造函数中实例化 JFrame。但是,除非我弄错了,否则这样做不会让我覆盖paint方法。我觉得有必要扩展 JFrame 以允许我覆盖绘画,但我再次读到这是错误的做法。
任何帮助都将不胜感激,我知道我可以根据他所拥有的内容对我的代码进行建模,但我真的很想了解这一点并知道处理它的最佳方法。
【问题讨论】:
看看 How can I set in the midst? 和 How to get the EXACT middle of a screen, even when re-sized 看看为什么你不应该覆盖像JFrame
这样的***容器的 paint
。
JFrame
也有一个 JRootPane
和 contentPane
位于其顶部,如果由于绘画方式的性质,这些可以独立于框架进行绘画,从而导致画到要画的框架上,而您却不知道。您还将自己锁定在一个用例中,使您的代码难以重用
我同意您关于将主类与 UI 分离的假设,但这不应阻止您从其他 UI 类扩展,例如 paintComponent
。然后,这允许您在您认为合适的任何其他容器中重用这些类
【参考方案1】:
我知道有必要重写paint方法
不,你不应该重写 paint() 方法。
您应该覆盖 JPanel 的 paintComponent()
方法,然后将面板添加到框架中。
阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。
本教程还将向您展示如何更好地构建代码,以便在事件调度线程 (EDT) 上创建 GUI。本教程还有一个关于 Concurrency
的部分,它将解释为什么这很重要。
【讨论】:
以上是关于覆盖paint()方法的主要内容,如果未能解决你的问题,请参考以下文章