未修饰的按钮:带有MouseListener的JButton或JLabel?

时间:2013-01-22 14:42:05

标签: java swing jbutton jlabel

我希望实现一个不显示边框或其他任何内容的按钮,但将鼠标悬停在其上时会发生变化的图像除外。单击图像(显示悬停图像)将执行一些代码。

我还想将所有这些放在一个单独的类中,因此我有一个可重用的组件。

扩展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。 / p>

那我该怎么用? JLabel还是JButton?

2 个答案:

答案 0 :(得分:4)

使用JButton.setXxxIcon

的已实施方法
button.setRolloverIcon((Icon));
button.setPressedIcon(Icon);
button.setDisabledIcon(Icon);

代替MouseListener,您可以实施ButtonModel

答案 1 :(得分:3)

  

那我该怎么用? JLabel还是JButton?

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