猿问

paintComponent是如何工作的?

paintComponent是如何工作的?

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

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

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

但它何时被称为?我从来没有看到像“object.paintComponent(g)”这样的东西,但它仍然是在程序运行时绘制的。

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

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


白猪掌柜的
浏览 2169回答 3
3回答

江户川乱折腾

对你的问题的(非常)简短回答paintComponent是“当它需要时”。有时将Java Swing GUI系统视为“黑盒子”更容易,其中许多内部构件在没有太多可见性的情况下处理。有许多因素决定了何时需要重新绘制一个组件,包括移动,重新调整大小,改变焦点,被其他框架隐藏,等等。其中许多事件都是自动神奇地检测到的,并且paintComponent在确定需要进行该操作时在内部调用。我和Swing一起工作了很多年,我认为我没有paintComponent直接打过电话,甚至没有直接打过电话。我最接近的是使用repaint()方法以编程方式触发某些组件的重绘(我假设调用paintComponent下游的正确方法)。根据我的经验,paintComponent很少直接覆盖。我承认有些自定义渲染任务需要这样的粒度,但Java Swing确实提供了一套(相当)强大的JComponents和Layouts,可用于完成大部分繁重工作而无需直接覆盖paintComponent。我想我的观点是确保在您尝试滚动自己的自定义渲染组件之前,您无法对本机JComponents和Layouts执行某些操作。

万千封印

调用object.paintComponent(g)是一个错误。而是在创建面板时自动调用此方法。该paintComponent()方法也可以通过类中repaint()定义的方法显式调用Component。调用的效果repaint()是Swing自动清除面板上的图形并执行该paintComponent方法以重绘该面板上的图形。
随时随地看视频慕课网APP

相关分类

Java
我要回答