重写BasicButtonUI的paintButtonPressed方法

本文介绍了如何在Java中实现自定义关闭按钮的效果,特别是改变JButton按压状态下的背景色。通过重写BasicButtonUI的paintButtonPressed方法,并设置特定的UI,避免全局影响,实现了鼠标选中和按压时不同的颜色变化。此外,还提到了继承JButton并重写部分方法的另一种选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写项目时需要写自定义的关闭按钮,通过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按压状态下的默认背景色

运行后可以正常显示

                                                              

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值