javapaint⽅法调⽤_Javapaint()⽅法个⼈理解
这些天给同学讲了不少次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),并且把当前对象的画笔传了进去吧,唯⼀能让我想到让东西显⽰出来的⽅法就是tVisible了,翻了⼏层⽗类关系,好像是在Component类中看到了repaint()⽅法,借此,我⽬前的理解就到这⾥了吧。
除此之外,就我们平时使⽤的JContainer下的JFrame或者是JPanel⽽⾔,add⽅法可以为其加上⾃⼰的组件,之前我并没有在意过,组件究竟是怎么被加上去的。直到前两天有⼈问我,组件是加在JFrame之上的,⽽画笔也是把内容画在JFrame上。这之间的图层关系总是搞不懂,为什么画出来的东西会盖住之前加的组件呢?唯⼀的解释就是,组件看起来是被加上去的,实际上则是被JContainer⾥的paint()⽅法画在容器上的。所以⼀开始先加的组件,在paint()⽅法⾃动执⾏的时候,调⽤了super.paint(g)会被先画出来,然后再继续画⾃⼰想要的东西,就会盖住之前的组件了。这样的解释也正好能够迎合为什么组件内都会有个paintComponent⽅法,这个⽅法估计就是容器调⽤组件⽤来绘制⾃⼰的⽅法吧。⽽组件之间的绘制⽅法也有差距,类如JLabel本⾝⽆法获取焦点,如果paint()⾥不调⽤super.paint()似乎会出现⽆法正常显⽰的状况,有的⼈说我说的这种情况不对,不过我昨天所见识到的确实是这个样⼦。但是和JLabel相对的类似JButton的功能性的,总是能够在显⽰出来的时候获取到焦点,抑或者是⿏标从上⾯经过,会触发⼀些显⽰效果,都能触发他们的绘制⽅法,然后正常显⽰出来。但是继承了⽗类的paint之后,就都能正常显⽰了。
懒得翻源码,瞎猜真有意思,就怕误⼈⼦弟啊,⼤家随便看看就⾏。