TITLE:JTableのセルのハイライト

Posted by aterai at 2004-03-21

JTableのセルのハイライト

セル上にマウスがある場合、その色を変更します。

  • &jnlp;
  • &jar;
  • &zip;
CellHighlight.png

サンプルコード

class HighlightListener extends MouseInputAdapter { //[JDK 6] MouseAdapter {
  private int row = -1;
  private int col = -1;
  private final JTable table;
  public HighlightListener(JTable table) {
    this.table = table;
  }
  public boolean isHighlightableCell(int row, int column) {
    return this.row==row && this.col==column;
  }
  @Override
  public void mouseMoved(MouseEvent e) {
    Point pt = e.getPoint();
    row = table.rowAtPoint(pt);
    col = table.columnAtPoint(pt);
    if(row<0 || col<0) {
      row = -1; col = -1;
    }
    table.repaint();
  }
  @Override
  public void mouseExited(MouseEvent e) {
    row = -1; col = -1;
    table.repaint();
  }
}
class HighlightRenderer extends DefaultTableCellRenderer {
  private final HighlightListener highlighter;
  public HighlightRenderer(JTable table) {
    super();
    highlighter = new HighlightListener(table);
    table.addMouseListener(highlighter);
    table.addMouseMotionListener(highlighter);
  }
  public Component getTableCellRendererComponent(JTable table, Object value,
                           boolean isSelected, boolean hasFocus,
                           int row, int column) {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    setHorizontalAlignment((value instanceof Number)?RIGHT:LEFT);
    if(highlighter.isHighlightableCell(row, column)) {
      setBackground(Color.RED);
    }else{
      setBackground(isSelected?table.getSelectionBackground():table.getBackground());
    }
    return this;
  }
}

解説

セルレンダラーにMouseListener、MouseMotionListenerを追加し、マウスカーソルが乗っているセルの色を変更しています。

JTable#prepareRendererをオーバーライドする場合も、同様の方法が使用できます。

class HighlightableTable extends JTable {
  private final HighlightListener highlighter;
  public HighlightableTable(TableModel model) {
    super(model);
    highlighter = new HighlightListener(this);
    addMouseListener(highlighter);
    addMouseMotionListener(highlighter);
  }
  @Override
  public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    Component c = super.prepareRenderer(renderer, row, column);
    if(highlighter.isHighlightableCell(row, column)) {
      c.setBackground(Color.RED);
    }else if(isRowSelected(row)) {
      c.setBackground(getSelectionBackground());
    }else{
      c.setBackground(Color.WHITE);
    }
    return c;
  }
}

参考リンク

コメント

  • ソースコードの整理、スクリーンショットの更新 -- aterai