`

paint repaint paintComponent update

    博客分类:
  • java
阅读更多

其实java里设置属性后会导致重绘的,只不过由于这个重绘事件也被放在事件派发线程里的,因此就导致了事件派发线程被Idle了,要避免这种情况,将这个堵塞动作放到另外的线程里面完成。  
          repaint是出发重绘动作,当调用repaint后,会通知repaintManager增加一个重绘区域,repaintManager在一定条件下会合并一些重绘区域,然后派发一个绘制动作到事件派发线程(EventQueue)。  
          事件派发线程执行到这个绘制事件时,就会调用组件的paint,在paint方法里会先调用update来将重绘区域清空(默认情况下是填充白色),然后再调用paintComponent来绘制自身,最后调用paintChildren来绘制所有的子。具体流程可以参考JComponent里的paint方法.

public void update(Graphics g)
调用 paint。不清除背景,而是查看 ComponentUI.update,它由 paintComponent 调用。

JComponent:paint(Graphic g)由 Swing 调用,以绘制组件。应用程序不应直接调用 paint,而是应该使用 repaint 方法来安排重绘组件。

此方法实际上将绘制工作委托给三个受保护的方法:paintComponentpaintBorderpaintChildren。按列出的顺序调用这些方法,以确保子组件出现在组件本身的顶部。一般而言,不应在分配给边框的 insets 区域绘制组件及其子组件。子类可以始终只重写此方法。只想特殊化 UI(外观)委托的 paint 方法的子类应该只重写 paintComponent

protected void paintComponent(Graphics g)
如果 UI 委托为非 null,则调用该 UI 委托的 paint 方法。向该委托传递 Graphics 对象的副本,以保护其余的 paint 代码免遭不可取消的更改(例如 Graphics.translate)。

如果在子类中重写此方法,则不应该对传入到 Graphics 中的内容进行永久更改。例如,不应更改剪裁矩形 或修改转换。如果需要进行这些操作,您会发现根据传入的 Graphics 创建一个新 Graphics 并操作它会更容易一些。另外,如果不调用超类的实现,则必须遵守不透明属性,也就是如果此组件是不透明的,则必须以透明的颜色完全填充背景。如果不遵守不透明属性,则很可能看到可视化的人为内容。

传入的 Graphics 对象可能具有与该对象上已安装的标识转换所不同的转换。在这种情况下,如果多次应用其他转换,则可能得到不可预料的结果。

protected void paintChildren(Graphics g)
绘制此组件的子组件。如果 shouldUseBuffer 为 true,则所有的组件祖先都没有缓冲区,并且组件子级可以使用缓冲区(如果有)。否则,祖先具有当前正在使用的缓冲区,并且子组件应该不使用缓冲区进行绘制。
public void print(Graphics g)
调用此方法以打印组件。此方法将导致对 printComponentprintBorderprintChildren 的调用。建议不重写此方法,而是重写前面提及的方法之一。此方法设置组件的状态,使得双缓冲区不被使用,例如直接在传入的 Graphics 上完成绘制。

protected void printComponent(Graphics g)

在打印操作期间调用此方法。实现此方法以对该组件调用

 

paintComponent

。如果要在打印时添加特殊的绘制行为,可重写此方法

protected void printChildren(Graphics g)
打印此组件的子组件。实现此方法以对该组件调用 paintChildren。如果希望以不同于绘制的方式打印子组件,则重写此方法
public void updateUI()
将 UI 属性重置为当前外观的值。JComponent 的子类必须以如下方式重写此方法:
   public void updateUI() {
      setUI((SliderUI)UIManager.getUI(this);
   }
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Swing框架定制Component

    在Swing中,`update`方法仅仅是简单地调用`paint`方法来完成组件的渲染。 - **paintComponent方法**: 这个方法是用于绘制组件自身而不包括子组件的方法。例如,对于`JComponent`类来说,它会在调用`paintComponent`...

    java绘图方面的源码

    同时,AWT的`Canvas`类是用于自定义绘图的空白画布,开发者可以通过重写`paint()`或`update()`方法来实现自己的绘图逻辑。 2. **Swing绘图** Swing是建立在AWT之上的GUI库,提供了更为丰富和现代的组件。Swing中的...

    用java做坦克游戏.doc

    - 重画过程:`repaint()`调用`update()`,`update()`再调用`paint()`。 - 了解`paintComponent()`方法在自定义组件中的使用。 4. **代码优化**: - 将经常变化的数值定义为常量。 - 使用构造方法初始化对象的...

    java绘画白板java绘画白板

    你可以重写`paint()`方法或者`update()`方法来进行定制化的绘制。 3. **Graphics对象** 当你在`Canvas`上进行绘制时,会使用到`Graphics`对象。它是所有图形绘制操作的入口点,提供了各种绘制方法,如`drawLine()`...

    Java 实现画图板

    `repaint()`会触发`paint()`或`update()`方法,更新组件的视图。 9. **Swing的替代方案** 虽然AWT可以实现这个功能,但Swing提供了更好的用户体验和更多的组件选择。使用`JPanel`代替`Canvas`,并覆盖`...

    2018-autumn-hw-17020031057-石晓晨-201811031

    在AWT中,我们使用paint(Graphics g)和update(Graphics g)方法进行绘图,而Swing提供了paintComponent(Graphics g)、paintBorder(Graphics g)和paintChildren(Graphics g)方法。repaint()方法用于触发重绘。 **外观...

    2021-2022计算机二级等级考试试题及答案No.916.docx

    在JPanel子类中,需要重写`paintComponent()`方法,而不是`paint()`、`repaint()`或`update()`方法。`paintComponent()`是用于绘制组件内容的专用方法,可以在此调用绘图API如`Graphics`来绘制图形。 2. 程序设计...

    全国2009年1月高等教育自学考试Java语言程序设计 试题

    `paint()`和`update()`是父类Component的方法,`repaint()`是用来请求组件重绘的方法。所以答案是B。 8. **多线程与Runnable接口**:实现Runnable接口并重写run()方法是创建线程的一种方式。线程对象的创建和启动...

    2021-2022计算机二级等级考试试题及答案No.19624.docx

    - 在 Java 中,`JPanel` 是一个常用的容器组件,要自定义绘图,需要重写 `paintComponent()` 方法,而不是 `paint()`, `repaint()`, 或 `update()`。 4. **外围设备**: - 外围设备包括主机之外的各种硬件,如...

    Java全国自考历年考试(参考答案)2.doc

    - `paint()`方法用于在容器上进行基本的绘画操作,但在Swing中推荐重写`paintComponent()`方法来实现更复杂的绘图功能。 - `repaint()`方法用于刷新组件,使其重新绘制。 - `update()`方法用于更新组件的状态,但...

    2021-2022计算机二级等级考试试题及答案No.11632.docx

    - `repaint()`: 强制组件重新绘制。 - `update()`: 更新组件的内容。 - **结论**: 若要在JPanel子类中重定义绘图方法,应覆盖`paintComponent()`方法。 #### 16. 数组元素访问 - **知识点**: 在Java中,数组是...

Global site tag (gtag.js) - Google Analytics