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