TITLE:JTableのCellEditorとCellRendererにJSliderを使用する

Posted by aterai at 2010-02-08

JTableのCellEditorとCellRendererにJSliderを使用する

JTableのCellEditorとCellRendererにJSliderを使用するように設定します。

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

サンプルコード

class SliderEditorRednerer extends AbstractCellEditor
                           implements TableCellRenderer, TableCellEditor {
  private final JSlider sliderEditor   = new JSlider();
  private final JSlider sliderRenderer = new JSlider();
  public SliderEditorRednerer(final JTable table) {
    sliderEditor.setOpaque(true);
    sliderRenderer.setOpaque(true);
    sliderEditor.addChangeListener(new ChangeListener() {
      public void stateChanged(ChangeEvent e) {
        EventQueue.invokeLater(new Runnable() {
          @Override public void run() {
            int row = table.convertRowIndexToModel(table.getSelectedRow());
            table.getModel().setValueAt(sliderEditor.getValue(), row, 0);
          }
        });
      }
    });
  }
  public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column) {
    Integer i = (Integer)value;
    sliderEditor.setBackground(table.getSelectionBackground());
    sliderEditor.setValue(i.intValue());
    return sliderEditor;
  }
  public Object getCellEditorValue() {
    return Integer.valueOf(sliderEditor.getValue());
  }
  public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Integer i = (Integer)value;
    sliderRenderer.setBackground(isSelected?table.getSelectionBackground():table.getBackground());
    sliderRenderer.setValue(i.intValue());
    return sliderRenderer;
  }
}

解説

上記のサンプルでは、1列目のセルエディタ、レンダラーにJSliderを使用するように設定しています。このスライダーの値を変更すると、同じ行の0列目の値も変更されるように、セルエディタにChangeListenerを追加しています。

コメント