今天偶然又拾起swing相关知识,突然看到以前自己对于JFrame背景和边框的处理。
发现以前对这两点的处理自己现在怎么有些看不懂了,首先是关于背景的处理,我们其实实现是对JPanel的重绘,其次为了实现对边框的处理我们做了很多工作才实现,可是自己明明看见有类似setBorder的方法啊,而且我们使用的一般是paintComponents方法,我们为什么不使用paint方法呢?二者又有什么区别呢?
首先是关于我们为什么不使用setBorder对JFrame实现边框重绘呢?
后来查阅了API才知道,setBorder是JComponent的方法,我们一般如JPanel,JButton等才继承自该类,才能实现对边框的改变。而我们的JFrame其实是继承自Window所以二者虽然在Container之前的继承都一样,但是JComponent和Window分别是Container的两个子类,也就是说在这里二者就不同了。所以我们的setBorder方法只对继承自JComponent的子类有用。
其次是关于paint和paintComponent的区别,其实我们只要查一下就能很清楚的发现二者的区别,paint :由 Swing 调用,以绘制组件。此方法实际上将绘制工作委托给三个受保护的方法:paintComponent、paintBorder 和 paintChildren。所以只想特殊化 UI(外观)委托的 paint 方法的子类只需重写 paintComponent。
最后我们不对JFrame重绘其实是倒不是不能对JFrame进行重绘,而是我们一般对JFrame的操作都是集中在对contentPanel的操作上通过实现对JPanel背景的重绘然后将其设置成ContentPanel很方便。其次主要是对于背景大小的操作很方便。
public void paint (Graphics g){
g.drawImage(backGroundImage, 0, 0, width, height, null); super.paint(g);}
其实我们每学一段时间Java之后反过来看一下以前所学,往往能把以前所遗忘或者以前不是很清楚的东西搞明白,这也是一种学习!