我希望根据鼠标事件(鼠标进入,退出,按下等)获得自定义颜色。所以要做到这一点,我写了下面的代码。它对一切都很好,除了鼠标按下事件的情况,什么都不做。
它仅在我覆盖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:
所以,我没有使用鼠标监听器,而是使用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));
}
}
});
答案 0 :(得分:23)
问题是由于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();
}
});
}
}
答案 1 :(得分:10)
从不,不要将MouseListener用于JButton
已实施
1)isPressed
2)isArmed
3)isRollover
4)e.i。
答案 2 :(得分:2)
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);
}
}
});
}
}
答案 3 :(得分:0)
就我而言,我只想在用户按下按钮时进行简单的背景和颜色切换。
适应的Guillaume Polet解决方案:
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);
}
}
答案 4 :(得分:0)
这对我有用!试试这个兄弟...
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());
}
});
答案 5 :(得分:-1)
可能只是可以尝试使用:Color.PINK,大写字母?这样做会有什么变化吗?
也不会鼠标按下&amp; mouseclicked互相覆盖?当你按下它时,鼠标按压应该反应。释放按下鼠标时单击
答案 6 :(得分:-1)
您可以尝试将背景设置为可伸缩的图像文件并将其设置为背景,而不是设置颜色,因为看起来不起作用。可能有用吗?
答案 7 :(得分:-1)
尝试使用已有的内容:
yourButton.setBorder(null);
yourButton.setContentAreaFilled(false);