2

我想实现一个不显示边框或其他任何内容的按钮,除了当您将鼠标悬停在其上时会更改的图像。单击图像(显示悬停图像)将执行一些代码。

我还想把所有这些放在一个单独的类中,这样我就有了一个可重用的组件。

扩展 JButton 为我提供了 addActionListener() 等方法。但是使用 setAction() 方法会删除我在构造函数中设置的图像。所以它不是无懈可击的,因为我不能将 Action 与此类结合使用。而且我当然不想覆盖像 setAction() 这样的方法。

public class JHoverLabel extends JButton {

private final Icon normal;
private final Icon hovered;

public JHoverLabel (Icon normal, Icon hovered) {
    this.normal = normal;
    this.hovered = hovered;

    setIcon(normal);

    setFocusPainted(false);
    setMargin(new Insets(0, 0, 0, 0));
    setContentAreaFilled(false);
    setBorderPainted(false);
    setOpaque(false);

    addMouseListener(new HoverListener());
}


private class HoverListener implements MouseListener {

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {
        setIcon(hovered);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        setIcon(normal);
    }

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}        
} 
}

扩展 JLabel 似乎可以与 MouseListener 结合使用,但我觉得在这里使用了错误的组件,因为“点击我做某事”基本上将我带到了一个 JButton。

那我应该用什么?JLabel 还是 JButton?

4

2 回答 2

4

使用JButton.setXxxIcon的实现方法

button.setRolloverIcon((Icon));
button.setPressedIcon(Icon);
button.setDisabledIcon(Icon);

而不是MouseListener你可以实现ButtonModel

于 2013-01-22T14:48:00.733 回答
3

那我应该用什么?JLabel 还是 JButton?

使用JButton. 您的鼠标挑战用户会感谢您。

于 2013-01-22T14:45:06.897 回答