自定义外观的Button

派生自
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()

你可能感兴趣的:(设计模式,C++,c,mvc,swing)