只有按下并且鼠标不在按钮上时,JButton应该在按下时更改背景

时间:2016-06-27 18:10:34

标签: java button listener

我正在进行整个基于事件的Java编程,除了在Java中创建和修改GUI之外,我遇到的最简单和最初的事情之一就是在悬停时更改按钮的背景颜色 - 结束,按下,启用等。

目前,我有关于按钮的这段代码:

public class SampleForm extends JFrame implements ActionListener, ChangeListener{
private JPanel rootPanel;
private JButton fooButton;
private JButton barButton;

public SampleForm() {
    super("Window");
    setContentPane(rootPanel);
    pack();
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setSize(400, 400);
    setVisible(true);
    fooButton.addActionListener(this);
    barButton.addActionListener(this);
    fooButton.addChangeListener(this);
    barButton.addChangeListener(this);
}

public void stateChanged(ChangeEvent e) {
    AbstractButton abs = (AbstractButton) e.getSource();
    ButtonModel model = abs.getModel();

    if (e.getSource() == barButton)
        if (model.isPressed()) {
            barButton.setBackground(new Color(255, 255, 255));
        } else if (model.isRollover()){
            barButton.setBackground(new Color(174, 20, 70));
        } else if (!model.isEnabled()) {
            barButton.setBackground(new Color(0, 0, 0));
        } else {
            barButton.setBackground(new Color(60, 63, 65));
        }

}

public void actionPerformed(ActionEvent event){
    if (event.getSource() == fooButton){
        barButton.setEnabled(true);
    } else {
        barButton.setEnabled(false);
    }
}

我在IntelliJ中创建了表单,因此它处理添加到面板的整个元素,这意味着表单完美呈现。当我单击fooButton时,barButton已启用并获得深灰色。当我将鼠标悬停在它上面时,它会变成偏红的颜色(到目前为止效果很好)。

然而,当我按下按钮时,按钮应该变为白色,而是成为默认的高亮度青色,并保持这样。如果按住按钮,但将鼠标从按钮上移开(鼠标没有悬停在按钮上),按下时按钮会变为白色。

我尝试了很多属性并试图查明罪魁祸首,但很明显我错过了一些东西。我已经制作了一个.gif来向你展示我的意思:

http://imgur.com/AeppEtF

请原谅我在开始和结束时摇摆不定的老鼠:D

提前谢谢!

2 个答案:

答案 0 :(得分:2)

将颜色更改为红色,您会发现问题不是您的想法,而是外观和感觉问题。 JButton的背景颜色不是你想象的那样。

问题是Swing使用的是MVC模型,而且绘画不是由JButton制作的,而是由相关的ButtonUI制作的。这个ButtonUI(实际上是它的子类)取决于外观,因此按钮的绘制符合当前的外观。

试试这个:

class MyUI extends javax.swing.plaf.basic.BasicButtonUI {
  protected void  paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) {
    super.paintText(g,b,textRect,text);
  }
}

public class SampleForm extends JFrame implements ActionListener, ChangeListener{
  public SampleForm() {
    super("Window");
    fooButton = new JButton("jkljkl");
    fooButton.addActionListener(this);
    fooButton.addChangeListener(this);
    fooButton.addMouseListener(this);
    fooButton.setUI(new MyUI());

您将看到按钮的行为方式符合您的喜好。

答案 1 :(得分:0)

问题是“点击”按钮实际上正在按下并释放它。因此,以下语句确定单击后按钮的外观:

} else {
    barButton.setBackground(new Color(60, 63, 65));
}

希望有一种解决方法!

private boolean isClicked;

public SampleForm() {
    super("Window");
    isClicked = false;
    setContentPane(rootPanel);
    pack();
    // insert the rest of the constructor body here
}

public void stateChanged(ChangeEvent e) {
    AbstractButton abs = (AbstractButton) e.getSource();
    ButtonModel model = abs.getModel();
    if(e.getSource() == barButton)
        if(model.isPressed() && !isClicked) {
            barButton.setBackground(new Color(255, 255, 255));
            isClicked = true;
        } // insert the rest of the chained if-else statements here
}