如何在JButton上添加悬停效果?

14

我想创建一个Java桌面应用程序,其中我使用了两个按钮。我想在这些按钮上添加悬停效果。我的要求是:当我点击任何一个按钮时,它应该改变其背景颜色。

我该如何实现?

以下是我的代码:

public class Party1Party2 extends JFrame
{
    JButton b1;
    JButton b2;
    Container pane;

    public Party1Party2()
    {
        getContentPane().setBackground(new java.awt.Color(255, 255, 255));

    b2.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            JOptionPane.showMessageDialog(frame, "Welcome to allhabad High Court");
        }
    });

    b1.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            JOptionPane.showMessageDialog(frame, "Welcome to allhabad High Court");

        }
    });
  }
}

@peeskillet,你能告诉我如何将JButton制作成圆角矩形吗? - user3456343
老实说,我只会考虑更改外观和感觉。我不喜欢去修改组件的外观。请查看 这篇帖子修改外观 - Paul Samsotha
所有关于鼠标监听器的尝试都是错误的,有副作用,忽略那些答案。 - mKorbel
@mKorbel -- 你能否指引我更多关于为什么(或何时)不建议使用鼠标监听器以及首选的替代方法的学习资料?(不一定要在OP问题的上下文中)谢谢。我花了十五分钟在谷歌上搜索,但没有找到任何有用的信息。 - fountainhead
4个回答

25

您可以使用鼠标进入和退出JButton,并执行您想要的任何操作。

例如:

jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseEntered(java.awt.event.MouseEvent evt) {
        jButton1.setBackground(Color.GREEN);
    }

    public void mouseExited(java.awt.event.MouseEvent evt) {
        jButton1.setBackground(UIManager.getColor("control"));
    }
});

2
答案是错误的,所有鼠标事件都在JButtons API中实现,并且正确使用它们,而不是使用鼠标监听器。 - mKorbel
13
很容易,我认为你想表达的是有一种更好的方法来做这件事,但这不是错误的答案,至少对我来说不是,因为我已经做过很多次了。请在你的评论中更加现代化! - Salah
2
好的,那么下次请明确你是想编辑我的答案还是提醒我有更好的方法可以使用,因为在你之前的评论中并不清楚你的意思,当你说“忽略那些答案”和“答案是错误的”时。感谢你的提示,我会更新我的答案。 - Salah
4
这个讨论没有意义,特别是因为缺乏对“更好”的想法的参考。 我在这里找到了它:http://stackoverflow.com/questions/16733708/changing-value-of-boolean-when-mouse-cursor-hovers-over-a-jbutton/16733866#16733866 - Mariana
什么是“控件”? - Volazh

4

我曾经写过一个自定义的JButton,当鼠标通过动画悬停在其上时,它的透明度会发生变化。以下是该按钮的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class HoverButton extends JButton
{
  float alpha = 0.5f;

  public HoverButton(String text)
  {
    super(text);
    setFocusPainted(false);
    setBorderPainted(false);
    setContentAreaFilled(false);
    addMouseListener(new ML());
  }

  public float getAlpha()
  {
    return alpha;
  }

  public void setAlpha(float alpha)
  {
    this.alpha = alpha;
    repaint();
  }

  public void paintComponent(java.awt.Graphics g)
  {
    java.awt.Graphics2D g2 = (java.awt.Graphics2D) g;
    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
    super.paintComponent(g2);
  }

  public class ML extends MouseAdapter
  {
    public void mouseExited(MouseEvent me)
    {
      new Thread(new Runnable()
      {
        public void run()
        {
          for (float i = 1f; i >= .5f; i -= .03f)
          {
            setAlpha(i);
            try
            {
              Thread.sleep(10);
            }
            catch (Exception e)
            {
            }
          }
        }
      }).start();
    }

    public void mouseEntered(MouseEvent me)
    {
      new Thread(new Runnable()
      {
        public void run()
        {
          for (float i = .5f; i <= 1f; i += .03f)
          {
            setAlpha(i);
            try
            {
              Thread.sleep(10);
            }
            catch (Exception e)
            {
            }
          }
        }
      }).start();
    }

    public void mousePressed(MouseEvent me)
    {
      new Thread(new Runnable()
      {
        public void run()
        {
          for (float i = 1f; i >= 0.6f; i -= .1f)
          {
            setAlpha(i);
            try
            {
              Thread.sleep(1);
            }
            catch (Exception e)
            {
            }
          }
        }
      }).start();
    }
  }
}

这里是一个快速演示 HoverButton 的示例:

import javax.swing.*;
import java.awt.*;

public class Demonstration
{
  public Demonstration()
  {
    JFrame frame = new JFrame("Hover Button Demonstration");
    frame.setLayout(new GridBagLayout());
    frame.add(new HoverButton("Hover Button!!"));

    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  public static void main(String args[])
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        new Demonstration();
      }
    });
  }
}

好消息是,你可以调整代码来改变按钮的背景颜色,而且还可以以动画的方式实现。


1

哇,旧问题了,我知道,但是...

要更改背景,请使用:

b1.setBackground(new java.awt.Color(r, g, b));

在actionListener中。
要实现鼠标悬停效果,您可以使用:
b1.setRolloverEnabled(true);

但是你需要为按钮提供图标以便翻转。

否则,对于其他悬停效果,您需要使用mouseListener。


0

@Salah的答案一开始对我没用,但在我禁用按钮的滚动效果后就可以了

button1.setRolloverEnabled(false);

鼠标悬停效果会自动设置我的按钮的悬停颜色,这将覆盖我在 mouseEntered() 中所设置的颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接