覆盖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 也有一个 JRootPanecontentPane 位于其顶部,如果由于绘画方式的性质,这些可以独立于框架进行绘画,从而导致画到要画的框架上,而您却不知道。您还将自己锁定在一个用例中,使您的代码难以重用 我同意您关于将主类与 UI 分离的假设,但这不应阻止您从其他 UI 类扩展,例如 paintComponent。然后,这允许您在您认为合适的任何其他容器中重用这些类 【参考方案1】:

我知道有必要重写paint方法

不,你不应该重写 paint() 方法。

您应该覆盖 JPanel 的 paintComponent() 方法,然后将面板添加到框架中。

阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。

本教程还将向您展示如何更好地构建代码,以便在事件调度线程 (EDT) 上创建 GUI。本教程还有一个关于 Concurrency 的部分,它将解释为什么这很重要。

【讨论】:

以上是关于覆盖paint()方法的主要内容,如果未能解决你的问题,请参考以下文章

Java - 覆盖 >variable< 中的paint(Graphics g) 方法

如何正确覆盖 awt paint() 方法

挂钩时覆盖窗口未正确绘制

未调用 Paint 方法

B1260 [CQOI2007]涂色paint 区间dp

图片框覆盖 vb.net