我想实现一个不显示边框或其他任何内容的按钮,除了当您将鼠标悬停在其上时会更改的图像。单击图像(显示悬停图像)将执行一些代码。
我还想把所有这些放在一个单独的类中,这样我就有了一个可重用的组件。
扩展 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?