● 如何自定义按钮外观(metal视感下)
派生自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()。