java - 油漆组件是如何工作的?

标签 java swing paintcomponent

这可能是一个非常菜鸟的问题。我刚开始学习Java

不明白paintComponent方法的操作。我知道如果我想画一些东西,我必须重写paintComponent方法。

public void paintComponent(Graphics g)
{
   ...
}

但是什么时候调用呢?我从来没有见过像“object.paintComponent(g)”这样的东西,但它仍然是在程序运行时绘制的。

什么是 Graphics 参数?这个从哪里来?调用方法时必须提供参数。但正如我之前所说,似乎从未显式调用此方法。那么这个参数是谁提供的呢?为什么我们必须将其转换为 Graphics2D?

public void paintComponent(Graphics g)
{
    ...
    Graphics2D g2= (Graphics2D) g;
    ...
}

最佳答案

对您的问题的(非常)简短的回答是 paintComponent 被称为“当它需要时”。有时更容易将 Java Swing GUI 系统视为一个“黑匣子”,其中大部分内部结构都在没有太多可见性的情况下处理。

决定何时需要重新绘制组件的因素有很多,包括移动、调整大小、更改焦点、被其他框架隐藏等等。其中许多事件是自动检测到的,当确定需要该操作时,会在内部调用 paintComponent

我已经使用 Swing 多年了,我认为我没有曾经直接调用过 paintComponent,甚至没有看到它直接从其他东西调用过.我最接近的是使用 repaint() 方法以编程方式触发某些组件的重绘(我假设它在下游调用了正确的 paintComponent 方法。

根据我的经验,paintComponent 很少被直接覆盖。我承认有些自定义渲染任务需要这种粒度,但 Java Swing 确实提供了一组(相当)健壮的 JComponents 和 Layouts,可以用来完成大部分繁重的工作,而无需直接覆盖 paintComponent。我想我的意思是在你尝试推出你自己的自定义渲染组件之前,确保你不能用原生 JComponents 和 Layouts 做一些事情。

关于java - 油漆组件是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15544549/

相关文章:

java - 如何仅替换列表中的特定值

java - 尝试挂起异步请求的连接时出现 Jersey 错误

java - JTable:根据标题大小设置列宽

java - 奇怪的图形错误 : a copy of component A is painted on component B. 帮助! ( java )

java - 对于因 Java PaintComponent() 引用单独的类而导致的空指针异常错误有什么解决方案吗?

java - 使用同一个 Jbutton 多次更改形状的颜色

java - 安装java没有效果(jre或jdk,1.8来自oracle站点)

java - 无法获取 java 代码将用户输入的数据分配给 Joptionpane 中的对象字段

java - 如何通过按空格键切换 JPanel

java - 有没有办法将 jMenuBar 移动到 jFrame 顶部以外的其他位置?