gpt4 book ai didi

java - 如何在按下鼠标时更改 JButton 颜色?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:49 25 4
gpt4 key购买 nike

我想根据鼠标事件(鼠标进入、退出、按下等)自定义颜色。所以为了完成这个,我写了下面的代码。它适用于所有情况,但鼠标按下事件除外,它什么都不做。

它只有在我像这样 UIManager.put("Button.select", Color.red); 覆盖 UIManager 中的颜色时才有效。 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());
}
});

编辑1:因此,我没有使用 MouseListener,而是按照 mKorbel 的建议使用 ChangeListenerButtonModel。使用此代码,我仍然没有观察到按钮中按下鼠标的任何变化,除非我按下并拖动到按钮外。有什么想法吗?

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));
}
}
});

最佳答案

问题是由于 JButton 的内容区域默认填充,而 Metal L&F 会在按下按钮时自动用其内部选择的颜色填充它。

最好的办法是扩展 JButton 以创建您自己的按钮,禁用内容区域填充,并自己绘制按钮的背景。

这是一个小演示(不确定它是否适用于其他 L&F,甚至可以肯定它不适用):

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class TestButton {

class MyButton extends JButton {

private Color hoverBackgroundColor;
private Color pressedBackgroundColor;

public MyButton() {
this(null);
}

public MyButton(String text) {
super(text);
super.setContentAreaFilled(false);
}

@Override
protected void paintComponent(Graphics g) {
if (getModel().isPressed()) {
g.setColor(pressedBackgroundColor);
} else if (getModel().isRollover()) {
g.setColor(hoverBackgroundColor);
} else {
g.setColor(getBackground());
}
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}

@Override
public void setContentAreaFilled(boolean b) {
}

public Color getHoverBackgroundColor() {
return hoverBackgroundColor;
}

public void setHoverBackgroundColor(Color hoverBackgroundColor) {
this.hoverBackgroundColor = hoverBackgroundColor;
}

public Color getPressedBackgroundColor() {
return pressedBackgroundColor;
}

public void setPressedBackgroundColor(Color pressedBackgroundColor) {
this.pressedBackgroundColor = pressedBackgroundColor;
}
}

protected void createAndShowGUI() {
JFrame frame = new JFrame("Test button");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final MyButton btnSave = new MyButton("Save");
btnSave.setForeground(new Color(0, 135, 200).brighter());
btnSave.setHorizontalTextPosition(SwingConstants.CENTER);
btnSave.setBorder(null);
btnSave.setBackground(new Color(3, 59, 90));
btnSave.setHoverBackgroundColor(new Color(3, 59, 90).brighter());
btnSave.setPressedBackgroundColor(Color.PINK);
frame.add(btnSave);
frame.setSize(200, 200);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestButton().createAndShowGUI();
}
});

}

}

关于java - 如何在按下鼠标时更改 JButton 颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com