Как изменить цвет 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)
isPressed
2)
isArmed
3)
isRollover
4) 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);