如何更改鼠标按下时的JButton颜色?

我想根据鼠标事件(鼠标进入,退出,按下等)获得自定义颜色。 所以为了实现这一点,我写了下面的代码。 它对一切都很好,除了鼠标按下事件的情况,它什么都不做。 它只有在我覆盖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:所以,我没有使用鼠标监听器,而是按照ButtonModel建议使用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)); } } }); 

问题是由于JButton的内容区域默认填充,而金属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(); } }); } } 
  • 从不,不要将MouseListener用于JButton

  • 将ActionListener或ChangeListener与ButtonModel一起使用

  • 在ButtonModel中实现

    1) isPressed

    2) isArmed

    3) isRollover

    4)ei

  • JButton和ButtonModel的示例

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

可能只是可以尝试使用:Color.PINK,大写字母? 这样做有什么变化吗?

鼠标按下和鼠标按下也不会互相覆盖? 当您按下鼠标时,鼠标按下应该做出反应,当您松开按下鼠标时,它会被点击

由于看起来不起作用而不是设置颜色,您可以尝试将背景设置为可伸展的图像文件并将其设置为背景。 可能有用吗?

尝试使用您已有的:

 yourButton.setBorder(null); yourButton.setContentAreaFilled(false);