TITLE:JTableHeaderにJCheckBoxを追加してセルの値を切り替える

Posted by aterai at 2009-02-16

JTableHeaderにJCheckBoxを追加してセルの値を切り替える

JTableHeaderにJCheckBoxを追加して、同じ列のJCheckBoxで表示している値をすべて切り替えます。

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

サンプルコード

class HeaderRenderer implements TableCellRenderer {
  private final JCheckBox check = new JCheckBox("Check All");
  public HeaderRenderer(JTableHeader header) {
    check.setOpaque(false);
    check.setFont(header.getFont());
    header.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        JTable table = ((JTableHeader)e.getSource()).getTable();
        TableColumnModel columnModel = table.getColumnModel();
        int viewColumn = columnModel.getColumnIndexAtX(e.getX());
        int modelColumn = table.convertColumnIndexToModel(viewColumn);
        if(modelColumn == 0) {
          check.setSelected(!check.isSelected());
          TableModel m = table.getModel();
          Boolean f = check.isSelected();
          for(int i=0; i<m.getRowCount(); i++) m.setValueAt(f, i, 0);
          ((JTableHeader)e.getSource()).repaint();
        }
      }
    });
  }
  public Component getTableCellRendererComponent(
      JTable tbl, Object val, boolean isS, boolean hasF, int row, int col) {
    TableCellRenderer r = tbl.getTableHeader().getDefaultRenderer();
    JLabel l =(JLabel)r.getTableCellRendererComponent(tbl, val, isS, hasF, row, col);
    l.setIcon(new CheckBoxIcon(check));
    return l;
  }
  private static class CheckBoxIcon implements Icon{
    private final JCheckBox check;
    public CheckBoxIcon(JCheckBox check) {
      this.check = check;
    }
    public int getIconWidth() {
      return check.getPreferredSize().width;
    }
    public int getIconHeight() {
      return check.getPreferredSize().height;
    }
    public void paintIcon(Component c, Graphics g, int x, int y) {
      SwingUtilities.paintComponent(
        g, check, (Container)c, x, y, getIconWidth(), getIconHeight());
    }
  }
}

解説

上記のサンプルでは、JCheckBoxのアイコンを作成して、これをTableCellRenderer(=JLabel)にsetIconすることで描画しています。このため、ヘッダに追加したMouseListenerで切り替えを行っています。

参考リンク

コメント