我想根据鼠标事件(鼠标进入、退出、按下等)自定义颜色。所以为了完成这个,我写了下面的代码。它适用于所有情况,除了鼠标按下事件,它什么都不做。
仅当我像这样覆盖 UIManager
中的颜色时才有效 UIManager.put("Button.select", Color.red);
。 UIManager
的问题是它会改变我所有的按钮。
谁能告诉我我可能做错了什么,或者完成我想做的事情的最佳方法是什么?
我的代码:
final JButton btnSave = new JButton("Save");
btnSave.setForeground(new Color(0, 135, 200).brighter());
btnSave.setHorizontalTextPosition(SwingConstants.CENTER);
btnSave.setBorder(null);
btnSave.setBackground(new Color(3, 59, 90));
btnSave.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
btnSave.setBackground(new Color(3, 59, 90));
}
@Override
public void mousePressed(MouseEvent e) {
// Not working :(
btnSave.setBackground(Color.pink);
}
@Override
public void mouseExited(MouseEvent e) {
btnSave.setBackground(new Color(3, 59, 90));
}
@Override
public void mouseEntered(MouseEvent e) {
btnSave.setBackground(new Color(3, 59, 90).brighter());
}
@Override
public void mouseClicked(MouseEvent e) {
btnSave.setBackground(new Color(3, 59, 90).brighter());
}
});
Edit1:因此,我正在使用 ChangeListener
和 ButtonModel
而不是 MouseListener
,正如 mKorbel 所建议的。使用此代码,我仍然没有观察到按钮中按下鼠标的任何变化,除非我按下并拖动到按钮外。有什么想法吗?
btnSave.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
if (model.isRollover()) {
btnSave.setBackground(new Color(3, 59, 90).brighter());
} else if (model.isPressed()) {
btnSave.setBackground(Color.BLACK);
} else {
btnSave.setBackground(new Color(3, 59, 90));
}
}
});
原文由 ktulinho 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是由于 JButton 的内容区域默认填充,而 Metal L&F 会在按下按钮时自动用其内部选择的颜色填充它。
最好的办法是扩展 JButton 以创建您自己的按钮,禁用填充的内容区域,并自己绘制按钮的背景。
这是一个小演示(不确定它是否适用于其他 L&F,甚至可以肯定它不适用):