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

JTableのセルのハイライト

編集者:Terai Atsuhiro~

作成日:2004-03-21
更新日:2021-11-18 (木) 11:29:54
  • category: swing folder: CellHighlight title: JTableのセルのハイライト tags: [JTable, TableCellRenderer, MouseListener, MouseMotionListener] author: aterai pubdate: 2005-03-21T07:27:38+09:00 description: JTableのセル上にマウスカーソルが存在する場合、その背景色を変更します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTIqY941CI/AAAAAAAAATI/gk-sbbRE5gw/s800/CellHighlight.png

概要

JTableのセル上にマウスカーソルが存在する場合、その背景色を変更します。

概要

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

#screenshot

サンプルコード

#spanend
#spandel
class TestRenderer extends DefaultTableCellRenderer
#spanend
                   implements MouseListener, MouseMotionListener {
  private final JTable table;
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
class HighlightListener extends MouseAdapter {
#spanend
  private int row = -1;
  private int col = -1;
  public TestRenderer(JTable table) {
    super();
  private final JTable table;
#spanadd

#spanend
  public HighlightListener(JTable table) {
    this.table = table;
    table.addMouseListener(this);
    table.addMouseMotionListener(this);
  }
  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(this.row==row && this.col==column) {
      setBackground(Color.RED);
    }else{
      setBackground(isSelected?table.getSelectionBackground()
                              :table.getBackground());
    }
    return this;
#spanadd

#spanend
  public boolean isHighlightableCell(int row, int column) {
    return this.row == row && this.col == column;
  }
  public void mouseMoved(MouseEvent e) {
#spanadd

#spanend
  @Override public void mouseMoved(MouseEvent e) {
    Point pt = e.getPoint();
    row = table.rowAtPoint(pt);
    col = table.columnAtPoint(pt);
    if(row<0 || col<0) {
    if (row < 0 || col < 0) {
      row = -1;
      col = -1;
    }
    table.repaint();
  }
  public void mouseExited(MouseEvent e)  {
#spanadd

#spanend
  @Override public void mouseExited(MouseEvent e) {
    row = -1;
    col = -1;
    table.repaint();
  }
  public void mouseDragged(MouseEvent e) {}
  public void mouseClicked(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
}
#spandel
  • &jnlp;
  • &jar;
  • &zip;

解説

MouseListener、MouseMotionListenerをimplementsしたセルレンダラーを作成し、マウスカーソルが乗っているセルの色を変更しています。 class HighlightRenderer extends DefaultTableCellRenderer {
 private final HighlightListener highlighter;
JTable#prepareRendererをオーバーライドする場合も、同様の方法が使用できます。
#spanend
#spandel
class MyTable extends JTable implements MouseListener, MouseMotionListener {
#spanend
  private int row = -1;
  private int col = -1;
  public MyTable() {
  public HighlightRenderer(JTable table) {
    super();
    addMouseListener(this);
    addMouseMotionListener(this);
    highlighter = new HighlightListener(table);
    table.addMouseListener(highlighter);
    table.addMouseMotionListener(highlighter);
  }
  public MyTable(TableModel model) {
#spanadd

#spanend
  @Override 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;
  }
#spanadd
}
#spanend
#spanadd

解説

上記のサンプルでは、JTableMouseListenerMouseMotionListenerを追加してマウスカーソルが乗っているセルを取得し、セルレンダラーでこれを参照してその背景色を変更しています。
  • JTable#prepareRenderer(...)メソッドをオーバーライドする方法もある
    #spanend
    #spanadd
    class HighlightableTable extends JTable {
    #spanend
      private final HighlightListener highlighter;
    #spanadd
    
    #spanend
      public HighlightableTable(TableModel model) {
        super(model);
        addMouseListener(this);
        addMouseMotionListener(this);
        highlighter = new HighlightListener(this);
        addMouseListener(highlighter);
        addMouseMotionListener(highlighter);
      }
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        if(this.row==row && this.col==column) {
    #spanadd
    
    #spanend
      @Override public Component prepareRenderer(
            TableCellRenderer r, int row, int column) {
        Component c = super.prepareRenderer(r, row, column);
        if (highlighter.isHighlightableCell(row, column)) {
          c.setBackground(Color.RED);
        }else if(isRowSelected(row)) {
        } else if (isRowSelected(row)) {
          c.setBackground(getSelectionBackground());
        }else{
        } else {
          c.setBackground(Color.WHITE);
        }
        return c;
      }
      public void mouseMoved(MouseEvent e) {
        Point pt = e.getPoint();
        row = rowAtPoint(pt);
        col = columnAtPoint(pt);
        if(row<0 || col<0) {
          row = -1;
          col = -1;
        }
        repaint();
      }
      public void mouseExited(MouseEvent e)  {
        row = -1;
        col = -1;
        repaint();
      }
      public void mouseDragged(MouseEvent e) {}
      public void mouseClicked(MouseEvent e) {}
      public void mouseEntered(MouseEvent e) {}
      public void mousePressed(MouseEvent e)  {}
      public void mouseReleased(MouseEvent e) {}
    }
    

参考リンク

参考リンク

コメント

コメント