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

标签 java swing mouseevent jbutton

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

它只有在我像这样 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/

相关文章:

c++ - 在 qgraphicsview 中忽略 svg 图像透明部分上的鼠标事件?

java - 如何从 swing 代码获取任何应用程序的根安装目录?

C#、WinForms、等待计时器

java - (jzy3d) 如何在Scatter上有效显示工具提示?

Java抽象类泛型方法参数

java - 如何在 Swing GUI 中实现延迟?

java - 如何在 Java GUI 中只允许大写字母?

java - SIGSTOP 和 SIGTSTP 会损坏 JVM 吗?

java - 在 Android 上禁用所有音效(也包括硬件键)

java - 从文件中读取数据并将数据放入 JTable