TITLE:JTableに行ヘッダを追加

Posted by terai at 2006-09-04

JTableに行ヘッダを追加

JTableに行ヘッダを追加を追加します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

class RowHeaderList extends JList {
  private final JTable table;
  private final ListSelectionModel tableSelection;
  private final ListSelectionModel rListSelection;
  public RowHeaderList(ListModel model, JTable table) {
    super(model);
    this.table = table;
    setFixedCellHeight(table.getRowHeight());
    setCellRenderer(new RowHeaderRenderer(table.getTableHeader()));
    RollOverListener rol = new RollOverListener();
    addMouseListener(rol);
    addMouseMotionListener(rol);
    tableSelection = table.getSelectionModel();
    rListSelection = getSelectionModel();
  }
  class RowHeaderRenderer extends JLabel implements ListCellRenderer {
    private final JTableHeader header;
    public RowHeaderRenderer(JTableHeader header) {
      this.header = header;
      this.setOpaque(true);
      //this.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
      this.setBorder(BorderFactory.createMatteBorder(0,0,1,2,Color.GRAY));
      this.setHorizontalAlignment(CENTER);
      this.setForeground(header.getForeground());
      this.setBackground(header.getBackground());
      this.setFont(header.getFont());
    }
    public Component getListCellRendererComponent(JList list, Object value,
               int index, boolean isSelected, boolean cellHasFocus) {
      if(index==pressedRowIndex) {
        setBackground(Color.GRAY);
      }else if(index==rollOverRowIndex) {
        setBackground(Color.WHITE);
      }else if(isSelected) {
        setBackground(Color.GRAY.brighter());
      }else{
        setForeground(header.getForeground());
        setBackground(header.getBackground());
      }
      setText((value==null)?"":value.toString());
      return this;
    }
  }
}

解説

上記のサンプルでは、JListで作成した行ヘッダをJScrollPaneにsetRowHeaderViewメソッドで追加しています。

表の余白などに色がついているのは、テストの名残です。特に意味は無いのですが、そのまま残しています。

rowHeader.setBackground(Color.BLUE);
scrollPane.setBackground(Color.RED);
scrollPane.getViewport().setBackground(Color.GREEN);

参考リンク

コメント

  • 不正なセルレンダラーを設定していたので修正しました。 -- terai
  • excelのように、行ヘッダをクリックしてその行が選択されたり、テーブルの本体にてセルをクリックしてそのセルだけが選択されたりすることはできますか?いろいろ試しましたが、なかなかできませんでした。 -- javalover
    • セル選択は、table.setCellSelectionEnabled(true);で可能です。行ヘッダをクリックしてその行を選択することは、現在でも出来るような。もし、列のことなら、JTableHeaderに以下のようなコードを書けばよさそうです。 JTableHeaderをクリックしてそのColumnのセルを全選択を参考にしてください。 -- terai
    • あ、もしかして、TableCellRendererでセルの背景色を変更 の例のように、JTable#prepareRendererをオーバーライドして行ごとの背景色を変更していますか? あちらの例では、行選択しか考慮していなのでisRowSelectedを使って、一行まるごと選択色で塗りつぶすかどうかを判断しています*1が、セル選択する場合は、ちゃんとisCellSelected(int,int)でそのセルが選択されているかを判断する必要があります。 -- terai
  • ここのサンプルを変更して、行列ヘッダクリックで、各行列を選択するように変更しました。 -- terai