Как изменить цвет 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:
Итак, вместо прослушивателя мыши я использую ChangeListener и ButtonModel как предложено mKorbel. С помощью этого кода я все еще не наблюдаю никаких изменений на мыши, нажатой в кнопке, за исключением случаев, когда я нажимаю и перетаскиваю вне кнопки. Есть мысли?
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));
        }
    }
});
            6 ответов
проблема вызвана тем, что 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)
isPressed2)
isArmed3)
isRollover4) e.Я.
 
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);
                }
            }
        });
    }
}
может быть ничего, но может попробовать вместо этого использовать: цвет.Розовые, заглавные буквы? Какие-нибудь изменения при этом?
также не будет ли mousepressed & mouseclicked переопределять друг друга? mousepressed должен реагировать, когда вы нажимаете его и щелкнул, когда вы отпустите нажатие мыши
вместо установки цвета, потому что это не работает, вы можете просто попробовать установить фон в растягивающийся файл изображения и установить его в качестве фона. Это может сработать?
попробуйте это с тем, что у вас уже есть:
yourButton.setBorder(null);
yourButton.setContentAreaFilled(false);