JTableのCellEditorとCellRendererにJSliderを使用する
Total: 6704
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTable
のCellEditor
とCellRenderer
にJSlider
を使用するように設定します。
Screenshot
Advertisement
サンプルコード
class SliderRenderer extends JSlider implements TableCellRenderer {
public SliderRenderer() {
super();
setName("Table.cellRenderer");
setOpaque(true);
}
@Override public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
Integer i = (Integer) value;
setBackground(isSelected ? table.getSelectionBackground()
: table.getBackground());
setValue(i.intValue());
return this;
}
//Overridden for performance reasons. ---->
@Override public void firePropertyChange(String p, boolean ov, boolean nv) {}
// ...
}
class SliderEditor extends JSlider implements TableCellEditor {
public SliderEditor(final JTable table) {
super();
setOpaque(true);
addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
int row = table.convertRowIndexToModel(table.getEditingRow());
table.getModel().setValueAt(getValue(), row, 0);
table.getModel().setValueAt(getValue(), row, 1);
}
});
}
});
}
@Override public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
Integer i = (Integer) value;
this.setBackground(table.getSelectionBackground());
this.setValue(i.intValue());
return this;
}
@Override public Object getCellEditorValue() {
return Integer.valueOf(getValue());
}
//Copied from AbstractCellEditor
// ...
}
View in GitHub: Java, Kotlin解説
0
列目- 編集不可
1
列目JSlider
を継承するセルエディタ、セルレンダラーを作成して設定- このスライダーのセルエディタに
ChangeListener
を追加し、同じ行の0
列目の値と同期するよう設定
参考リンク
- CellEditorをJSpinnerにして日付を変更
- Bug ID: 6348946 JSlider's thumb moves in the wrong direction when used as a JTable cell editor.