Java 如何更改鼠标按下时的按钮颜色?
我想根据鼠标事件(鼠标进入、退出、按下等)定制颜色。为了实现这一点,我编写了下面的代码。这对任何事情都是好的,除了鼠标按下事件,它什么也不做。 仅当我覆盖Java 如何更改鼠标按下时的按钮颜色?,java,swing,mouseevent,jbutton,Java,Swing,Mouseevent,Jbutton,我想根据鼠标事件(鼠标进入、退出、按下等)定制颜色。为了实现这一点,我编写了下面的代码。这对任何事情都是好的,除了鼠标按下事件,它什么也不做。 仅当我覆盖UIManager中的颜色时,它才起作用,如UIManager.put(“Button.select”,color.red)。 ui管理器的问题在于,它将更改我的所有按钮 有谁能告诉我我可能做错了什么,或者什么是完成我试图做的事情的最佳方法 我的代码: final JButton btnSave = new JButton("Save");
UIManager
中的颜色时,它才起作用,如UIManager.put(“Button.select”,color.red)代码>。
ui管理器的问题在于,它将更改我的所有按钮
有谁能告诉我我可能做错了什么,或者什么是完成我试图做的事情的最佳方法
我的代码:
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());
}
});
编辑1:
因此,我使用的不是鼠标侦听器,而是mKorbel建议的ChangeListener
和ButtonModel
。有了这段代码,我仍然没有观察到鼠标按下按钮时的任何变化,除非我在按钮外按下并拖动鼠标。有什么想法吗
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));
}
}
});
只能尝试使用:Color.PINK,大写字母?这样做有什么变化吗
鼠标按下和鼠标滑动不会相互覆盖吗?按下鼠标时应做出反应,松开鼠标时应单击鼠标
- 永远不要,永远不要用它
- 使用或配合
- 在中实施
1)
isPressed
2) isArmed
3) isRollover
4) e.i
该问题是由以下事实引起的:一个按钮的内容区域在默认情况下是填充的,当按下按钮时,金属L&F会自动用其内部选择的颜色填充
最好的做法是扩展JButton来创建自己的按钮,禁用内容区域填充,并为自己绘制按钮的背景
这里有一个小演示(不确定它是否适用于其他L&F,甚至非常确定它不适用):
您可以尝试将背景设置为可拉伸图像文件,并将其设置为背景,而不是设置颜色,因为这似乎不起作用。这行得通吗?用你已经有的东西试试:
public class MyCustomButton extends JButton {
private Color pressedColor = Color.GREEN;
private Color rolloverColor = Color.RED;
private Color normalColor = Color.BLUE;
public MyCustomButton (String text) {
super(text);
setBorderPainted(false);
setFocusPainted(false);
setContentAreaFilled(false);
setOpaque(true);
setBackground(normalColor);
setForeground(Color.WHITE);
setFont(new Font("Tahoma", Font.BOLD, 12));
setText(text);
addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent evt) {
if (getModel().isPressed()) {
setBackground(pressedColor);
} else if (getModel().isRollover()) {
setBackground(rolloverColor);
} else {
setBackground(normalColor);
}
}
});
}
}
yourButton.setBorder(null);
yourButton.setContentAreaFilled(false);
在我的例子中,当用户按下按钮时,我只需要一个简单的背景和颜色切换
适应了纪尧姆·波尔特的解决方案:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.ButtonModel;
import javax.swing.JButton;
@SuppressWarnings("serial")
class Button extends JButton {
private Color pressedForeground = Color.BLACK;
private Color pressedBackground = Color.WHITE;
Button() {
this(null);
}
Button(String text) {
super(text);
super.setContentAreaFilled(false);
setForeground(Color.WHITE);
setBackground(Color.BLACK);
setFocusPainted(false);
setBorderPainted(false);
setFont(new Font("arial", Font.PLAIN, 16));
}
@Override
public void paint(Graphics g) {
Color oldFg = getForeground();
Color newFg = oldFg;
ButtonModel mod = getModel();
if (mod.isPressed()) {
newFg = pressedForeground;
g.setColor(pressedBackground);
} else {
g.setColor(getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
setForeground(newFg);
super.paintComponent(g);
setForeground(oldFg);
}
}
这对我有用!试试这个兄弟…
final JButton btnSave = new JButton("Save");
btnSave.setForeground(new Color(0, 135, 200).brighter());
btnSave.setHorizontalTextPosition(SwingConstants.CENTER);
btnSave.setBorder(null);
UIManager.put("Button.select", new Color(3, 59, 90)); //<--- Added ---
//btnSave.setBackground(new Color(3, 59, 90));
btnSave.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
UIManager.put("Button.select", new Color(3, 59, 90)); //<--- Added ---
//btnSave.setBackground(new Color(3, 59, 90));
}
@Override
public void mousePressed(MouseEvent e) {
// it's working :)
UIManager.put("Button.select", Color.pink); //<--- Added ---
//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());
}
});
final JButton btnSave=新JButton(“保存”);
setForeground(新颜色(0135200).brighter());
btnSave.setHorizontalTextPosition(SwingConstants.CENTER);
btnSave.setboorder(空);
UIManager.put(“按钮.选择”,新颜色(3,59,90))//好的,但为什么要在JButton
上添加鼠标侦听器?以便在鼠标进入、退出和按下时更改按钮的颜色。那么,为了突出显示鼠标上方的按钮等等,为什么会有这么多花哨的颜色?@ktulinho你读过我答案的第一段了吗?这清楚地解释了为什么这不起作用。也可以看到这个。可能什么都没有,但可以尝试使用:Color.PINK,大写字母?没什么。它们都表示完全相同的颜色。Color.PINK内部指的是Color.PINK。两者都是相同的。即使如此,mouseclicked事件不会发生在mousepressed事件之后吗?=>mouseClicked(MouseEvent)在用户单击侦听组件后立即调用。==>mousePressed(MouseEvent)在用户按下鼠标按钮后调用,同时光标位于侦听组件上。否,事件按以下顺序发生:按下鼠标,可能拖动鼠标,释放鼠标,然后可能单击鼠标(只要按钮尚未释放,就没有单击事件)+1表示<代码>新颜色(3,59,90).brighter().brighter()
,不是开玩笑:-)永远不要,不要在我从未使用过的按钮上使用鼠标侦听器。但是你能告诉我为什么吗?所有这些方法都是在按钮组件API
(从JButton到JMenuItem,再到JRadioButton)中实现的,在按钮模型中派生鼠标事件,按键事件,安全、直接、舒适,适用于所有L&Fs(我知道有三个例外,在L&Fs中并不重要):-)点:-)+1也是,确实使用ButtonModel是一种更好的方法@Che,依赖ButtonModel这样的高级模型抽象总是比依赖MouseListener这样的低级API要好得多。@GuillaumePolet+1。但是像我这样的人在工作的时候会知道这些事情。如果我遇到这种情况,我会去找MouseListener完成我的工作。我的问题是,我怎样才能/应该知道什么是最好的/更好的?@Che您的问题的答案是(@GuillaumePolet)higher model abstraction
v.s.low-level
final JButton btnSave = new JButton("Save");
btnSave.setForeground(new Color(0, 135, 200).brighter());
btnSave.setHorizontalTextPosition(SwingConstants.CENTER);
btnSave.setBorder(null);
UIManager.put("Button.select", new Color(3, 59, 90)); //<--- Added ---
//btnSave.setBackground(new Color(3, 59, 90));
btnSave.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
UIManager.put("Button.select", new Color(3, 59, 90)); //<--- Added ---
//btnSave.setBackground(new Color(3, 59, 90));
}
@Override
public void mousePressed(MouseEvent e) {
// it's working :)
UIManager.put("Button.select", Color.pink); //<--- Added ---
//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());
}
});