派生自 BasicButtonUI 的类可以改变按钮的外观,定位于 javax.swing.plaf.metal 的 MetalButtonUI 类,控制 metal 视感下 Button 的外观
JButton b = new JButton();
b.setUI(new MyUI);
2 .派生自 javax.swing.plaf.basic.BasicBorders.ButtonBorder 的类可以改变按钮的边框绘制, metal 视感下 JButton 边框由 javax.swing.plaf.metal.MetalBorders.ButtonBorder 绘制
b.setBorder();
★ 必须先 setUI 再 setBorder
● JButton 的结构
MVC 模式设计
Model : ButtonModel
View : BasicButtonUI ( 根据不同的视感,再有不同的子类,如 MetalButtonUI)
以及 javax.swing.plaf.metal.MetalBorders.ButtonBorder
,控制边框的绘制
MetalButtonUI 的 update 方法控制了按钮初始时的绘制( MetalUtils.drawGradient(c, g, "Button.gradient", 0, 0, c.getWidth(), c.getHeight(), true) ),因此,即使重写 paint() 方法,初始按钮仍然会被绘制。
Controller : JButton ( 一般使用 AbstractButton ,各种 Button 的父类 )
● about MetalUtils , Metal utility tools.
定位于javax.swing.plaf.metal.MetalUtils 提供了大量 Metal 视感下的辅助方法(按钮初始化的 Gradient 样式就是通过它的 drawGradient 方法绘制的)。并提供了三个 inner class 进行视感处理。
GradientPainter
OceanDisabledButtonImageFilter
OceanToolBarImageFilter
★ MetalUtils 不是 public class, 因此无法从外部包访问其
● 关于 MetalButtonUI 的 update 方法及 JButton 的初始绘制
MetalButtonUI .update() 负责绘制按钮的初始样式(调用 MetalUtils.drawGradient() 方法绘制)。然后调用 paint() 方法绘制其他效果( pressed, focus, text )。最后调用 super.update() 。
Super.update() 传递给 BasicButtonUI ,由于 BasicButtonUI 没有 overload update 方法,因此传递给 javax.swing.plaf.ButtonUI 。
ButtonUI 是一个 abstract class , 因此 update 方法继续传递给 javax.swing.plaf.ComponentUI 。
ComponentUI 的 update 方法只是简单的 fillRect 组件,然后调用 paint() 。