这些天给同学讲了不少次JUI的 paint()方法和画笔,就目前而言已经比当初自己写的时候理解的多了不少了,虽然有点花时间,但好处还是有的。(习惯把Graphics g对象叫做画笔)
  以前想要在某个容器上用画笔绘制东西来做游戏,直接给主类继承JPanel,然后只是把paint()+repaint()当作线程来使,感觉就这么背下来了。然后当我再看这个paint方法的时候,隐约记得有个方法叫做获取对象的画笔,又看到里面传入了一根画笔参数,有点不对劲。当我尝试在别人写的一个继承JFrame类中的paint方法内,调用JPanel的画笔的时候,先用getGraphics获取到JPanel的画笔,然后我唯一能想到需要传递画笔的地方就是在paint方法里需要super调用一下父类的paint方法,大概就是这里把画笔传递过去然后画在JPanel上的吧?唔。。结果什么都没出来,看起来不是从这里传递的。目前为止还有一个疑点,就是我总是在用的这个paint方法究竟是谁调用的,在哪调用的。既然能够super到父类,肯定是父类中有这个方法。那意思就是我继承什么容器,调用的就是谁的paint方法了呗,是谁的paint方法那不就是在谁身上画了呗。那在当前对象身上画东西,在哪调用的呢?在哪传递的画笔呢?我赌了一把,在JFrame构造方法里显式调用了一下this.paint(),然后把我获取到的JPanel画笔传了进去,果然画出来东西了。这样来的话,意思就是在我之前写的方法中,有某个方法偷偷调用了this.paint(g),并且把当前对象的画笔传了进去吧,唯一能让我想到让东西显示出来的方法就是setVisible了,翻了几层父类关系,好像是在Component类中看到了repaint()方法,借此,我目前的理解就到这里了吧。
  除此之外,就我们平时使用的JContainer下的JFrame或者是JPanel而言,add方法可以为其加上自己的组件,之前我并没有在意过,组件究竟是怎么被加上去的。直到前两天有人问我,组件是加在JFrame之上的,而画笔也是把内容画在JFrame上。这之间的图层关系总是搞不懂,为什么画出来的东西会盖住之前加的组件呢?唯一的解释就是,组件看起来是被加上去的,实际上则是被JContainer里的paint()方法画在容器上的。所以一开始先加的组件,在paint()方法自动执行的时候,调用了super.paint(g)会被先画出来,然后再继续画自己想要的东西,就会盖住之前的组件了。这样的解释也正好能够迎合为什么组件内都会有个paintComponent方法,这个方法估计就是容器调用组件用来绘制自己的方法吧。而组件之间的绘制方法也有差距,类如JLabel本身无法获取焦点,如果paint()里不调用super.paint()似乎会出现无法正常显示的状况,有的人说我说的这种情况不对,不过我昨天所见识到的确实是这个样子。但是和JLabel相对的类似JButton的功能性的,总是能够在显示出来的时候获取到焦点,抑或者是鼠标从上面经过,会触发一些显示效果,都能触发他们的绘制方法,然后正常显示出来。但是继承了父类的paint之后,就都能正常显示了。
  懒得翻源码,瞎猜真有意思,就怕误人子弟啊,大家随便看看就行。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐