自定义JButton外观(Java)

公司目前一个项目在Solaris10上开发,用户接口用Java,而底层用C/C++。为了获得独特的视感,因此要自己定义一批界面组件的样式,所以近期会有一些这方面的文章。
 如何自定义按钮外观(metal视感下) 
派生自BasicButtonUI的类可以改变按钮的外观,定位于javax.swing.plaf.metalMetalButtonUI类,控制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();

必须先setUIsetBorder

 

JButton的结构

MVC模式设计

ModelButtonModel

View BasicButtonUI (根据不同的视感,再有不同的子类,如MetalButtonUI)

          以及javax.swing.plaf.metal.MetalBorders.ButtonBorder

,控制边框的绘制

              MetalButtonUIupdate方法控制了按钮初始时的绘制(MetalUtils.drawGradient(c, g, "Button.gradient", 0, 0, c.getWidth(), c.getHeight(), true)),因此,即使重写paint()方法,初始按钮仍然会被绘制。

ControllerJButton (一般使用AbstractButton,各种Button的父类)

 

about MetalUtils, Metal utility tools.

定位于javax.swing.plaf.metal.MetalUtils提供了大量Metal视感下的辅助方法(按钮初始化的Gradient样式就是通过它的drawGradient方法绘制的)。并提供了三个inner class 进行视感处理。

       GradientPainter

       OceanDisabledButtonImageFilter

       OceanToolBarImageFilter

MetalUtils不是public class,因此无法从外部包访问其

 

关于MetalButtonUIupdate方法及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

       ComponentUIupdate方法只是简单的fillRect组件,然后调用paint()

 

你可能感兴趣的:(java,c,mvc,Solaris,Class,button)