如何让JButton在指定条件下始终呈现按下状态(非悬停时也生效)
问题根源在于WindowsClassic Look&Feel的WindowsButtonUI绘制按下状态时,同时要求ButtonModel的isPressed()和isArmed()都为true。你之前的代码只重写了isPressed(),但isArmed()默认仅在鼠标悬停在按钮上且按下时才返回true,导致鼠标离开后无法触发按下效果。
修正后的自定义ButtonModel
class MyButtonModel extends DefaultButtonModel { private boolean appearPressed; @Override public boolean isPressed() { return super.isPressed() || appearPressed; } @Override public boolean isArmed() { // 强制显示按下状态时,让isArmed()返回true,满足UI绘制条件 return super.isArmed() || appearPressed; } public void setAppearPressed(boolean appearPressed) { boolean oldState = this.appearPressed; this.appearPressed = appearPressed; if (oldState != appearPressed) { fireStateChanged(); // 通知UI状态变更,触发重绘 } } }
使用方式
给你的自定义JButton子类设置该模型,通过setAppearPressed()控制是否强制显示按下状态:
MyButtonModel customModel = new MyButtonModel(); yourCustomButton.setModel(customModel); // 开启强制按下状态 customModel.setAppearPressed(true); // 关闭强制按下状态 customModel.setAppearPressed(false);
关键说明
isArmed()的重写是核心:WindowsClassic L&F的按钮绘制逻辑依赖isPressed() && isArmed()的组合判断,仅重写isPressed()无法满足条件。fireStateChanged()必须调用:状态变更时通知UI重绘,确保按钮外观及时更新。
内容的提问来源于stack exchange,提问作者Robert Kock
相关产品推荐
相关产品推荐

