java - Swing Jbutton : showing border and background only when it is hovered

标签 java swing hover jbutton

我想为我自定义的 Swing.JButton 添加一个悬停效果,类似于我的 Chrome 浏览器上的图标:

悬停前>>

enter image description here

悬停后>>

enter image description here

我可以在创建按钮时将其设置为“之前”状态,但是当它悬停时我无法创建“边框+凸起背景”。当我尝试将边框重新添加到按钮时,我得到了一个移动效果,就像在重新绘制后插入了一个新边框一样。

这是我当前的代码:

public class MyButton extends JButton implements MouseListener {

public MyButton(String iconPath, String toolTip) {
    super(new ImageIcon(TipButton.class.getResource(iconPath)));
    addMouseListener(this);
    setBorder(null);
    setBorderPainted(false);
    setFocusPainted(false);
    setOpaque(false);
    setContentAreaFilled(false);
    setToolTipText(toolTip);
}

public MyButton(String iconPath, String name, String toolTip) {
    this(observers, iconPath, toolTip);
    setText(name);
}

@Override
public void mouseClicked(MouseEvent e) {}

@Override
public void mousePressed(MouseEvent e) {}

@Override
public void mouseReleased(MouseEvent e) {}

@Override
public void mouseEntered(MouseEvent e) {
    if (e.getSource() != this) return;

    setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
}

@Override
public void mouseExited(MouseEvent e) {
    if (e.getSource() != this) return;

    setBorder(null);
}

}

我想主要逻辑应该在 mouseEntered/mouseExited 方法中,但我不知道如何获得想要的效果。有什么想法吗?

最佳答案

我想我已经找到了解决办法。使用具有相同大小(插图)的凸起边框的 EmptyBorder 可以达到目的。代码:

public class SwingUtils {

public static JButton createMyButton (String iconPath, String toolTip) {
    final JButton b = new JButton (new ImageIcon(SwingUtils.class.getResource(iconPath)));
    final Border raisedBevelBorder = BorderFactory.createRaisedBevelBorder();
    final Insets insets = raisedBevelBorder.getBorderInsets(b);
    final EmptyBorder emptyBorder = new EmptyBorder(insets);
    b.setBorder(emptyBorder);
    b.setFocusPainted(false);
    b.setOpaque(false);
    b.setContentAreaFilled(false);
    b.setToolTipText(toolTip);
    b.getModel().addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            ButtonModel model = (ButtonModel) e.getSource();
            if (model.isRollover()) {
                b.setBorder(raisedBevelBorder);
            } else {
                b.setBorder(emptyBorder);
            }
        }
    });
    return b;
}

}

注意:正如 mKorbel 所说,它将使用 ChangeListener 和在工厂方法中创建的按钮,而不是子类 JButton。

关于java - Swing Jbutton : showing border and background only when it is hovered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17658305/

相关文章:

Java - 检查矩形 "fits"是否为二维数组(2d bin 打包)

java - SQLJ IN 语句支持

java - 提取查询结果时出现问题

java - Java中的多种2D图形绘制函数

java - 将表 JTable 中的空单元格读入数组

javascript - 使用后退按钮从重新访问的页面中删除悬停效果

css - 悬停时使最后一个 child 可见

java - 无法启动 spring boot web 应用程序

java - 图形元素不会出现在 JFrame (Java) 中

javascript - 将鼠标悬停在表格单元格上时弹出 <-- 这在 JavaScript 中可能吗?如果是这样,如何?