• category: swing folder: RolloverBooleanRenderer title: JCheckBoxのセルをロールオーバーする tags: [JTable, JCheckBox, MouseListener, TableCellRenderer] author: aterai pubdate: 2010-06-21T15:14:48+09:00 description: JTableのセルにJCheckBoxを使用したときでも、マウスカーソルでロールオーバーするように設定します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTSCUU481I/AAAAAAAAAiI/LzyeHFbwP40/s800/RolloverBooleanRenderer.png hreflang:
       href: https://java-swing-tips.blogspot.com/2010/07/create-jcheckbox-rollover-effect-in.html
       lang: en

概要

JTableのセルにJCheckBoxを使用したときでも、マウスカーソルでロールオーバーするように設定します。

サンプルコード

class RolloverBooleanRenderer extends JCheckBox implements TableCellRenderer, UIResource {
  private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
  private final HighlightListener highlighter;
  public RolloverBooleanRenderer(HighlightListener highlighter) {
    super();
    this.highlighter = highlighter;
    setHorizontalAlignment(SwingConstants.CENTER);
    setBorderPainted(true);
    setRolloverEnabled(true);
    setOpaque(true);
  }

  @Override public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
    if (highlighter.isHighlightableCell(row, column)) {
      getModel().setRollover(true);
    } else {
      getModel().setRollover(false);
    }
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      super.setBackground(table.getSelectionBackground());
    } else {
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    setSelected((value != null && ((Boolean) value).booleanValue()));
    if (hasFocus) {
      setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
    } else {
      setBorder(noFocusBorder);
    }
    return this;
  }
}
View in GitHub: Java, Kotlin

解説

  • 上: デフォルト
  • 下: JTable#setDefaultRendererメソッドで、ObjectNumberBooleanクラスそれぞれにマウスカーソルに反応するセルレンダラーを設定
    • これらのセルレンダラーはデフォルトのJTable$BooleanRendererクラスなどを参考に作成
    • JCheckBoxのロールオーバー表示はJCheckBox#getModel()#setRollover(boolean)メソッドを使用

参考リンク

コメント