重写BasicButtonUI的paintButtonPressed方法

来源:互联网 发布:淘宝上聚划算的要求 编辑:程序博客网 时间:2024/05/17 20:25

最近在写项目时需要写自定义的关闭按钮,通过JButton写关闭按钮但是JButton的默认选中状态是灰色,在按钮按压状态下会短暂显示灰色然后再关闭,而正常的关闭按钮为mouseEntered时为红,mousePressed时为浅红。如下两图所示

                                                               

            选中关闭键 按压关闭键

为了实现以上的功能正常的思路是addMouseListen(new Adpater{})

然后在Adapter中重写mousePressed和mouseEntered

代码如下

addMouseListener(new MouseAdapter() {    @Override    public  void mousePressed(MouseEvent e){        setBackground(new Color(240, 128, 128));   //浅红    }    @Override    public void mouseEntered(MouseEvent e) {        setBackground(new Color(176, 23, 31)); //暗红        isExit = false;    }    @Override    public void mouseExited(MouseEvent e){        isExit = true;        setBackground(Color.DARK_GRAY);    }    @Override    public void mouseReleased(MouseEvent e){        if(!isExit){            System.exit(0);        }    }});
但是代码若是如上所示的话在按压Button是背景色并不会改变,按压Button后会显示灰色。选中与按压图片如下

                                                   

    选中按钮 按压按钮

在网上搜寻信息后我们可以通过两种方法来修改按钮按压时的背景色

1.简单的办法:
UIManager.put("Button.select", 你希望的颜色);
但是用这个方法你需要注意两点:
①必须在 JButton 对象初始化之前调用这个语句
②这个改动会让你所有的 JButton 按下时的颜色变化


2.复杂的方法:
所以如果你不希望所有的按钮按下后都是一个色
那你需要用复杂一些的方法:
重写 ButtonUI 类中的 paintButtonPressed 方法
给你需要变色的 Button 一个自定义的 UI 类


我采用的是复杂的方法,即重写BasicButtonUI然后给调用JButton的setUI

在https://my.oschina.net/zhongwenhao/blog/89114 中好像还有一种方法是继承JButton重写部分方法。

在重写之前我借鉴了BasicButtonUI类的子类 MetalToggleButtonUI中重写paintButtonPressed的方法

源代码如下

protected void paintButtonPressed(Graphics g, AbstractButton b) {    if ( b.isContentAreaFilled() ) {        g.setColor(getSelectColor());        g.fillRect(0, 0, b.getWidth(), b.getHeight());    }}
其中fillRect方法为用制定画刷填充矩阵

以下为重写paintButtonPressed的代码

/** * 自定义一个重写过ButtonPress状态的UI类 */class customizedButtonUI extends BasicButtonUI {    @Override    public void paintButtonPressed(Graphics g, AbstractButton b){        g.setColor(new Color(240, 128, 128));//浅红        g.fillRect(0, 0, b.getWidth(), b.getHeight());    }}
再在自定义的Button类的构造函数中声明  setUI(new customedUI());

即可改变Button按压状态下的默认背景色

运行后可以正常显示

                                                              

    鼠标选中状态下                                                                     鼠标点击状态下

0 0