カーソルを合わせると変化する画像を除いて、境界線などを表示しないボタンを実装したいと思います。画像(ホバー画像を表示)をクリックすると、いくつかのコードが実行されます。
また、これらすべてを別のクラスに入れて、再利用可能なコンポーネントを用意したいと思います。
JButtonを拡張すると、メソッドaddActionListener()などが提供されます。ただし、setAction()メソッドを使用すると、コンストラクターで設定した画像が削除されます。したがって、このクラスと組み合わせてアクションを使用することはできないため、防水ではありません。そして、私は確かに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と組み合わせてやりたいことができるように見えますが、「click-on-me-to-do-something」は基本的にJButtonにつながるため、ここでは間違ったコンポーネントを使用しているように感じます。
だから私は何を使うべきですか?JLabelまたはJButton?