3
爲了將JSlider
轉換爲JTable
我寫了AbstractCellEditor
,它實現了TableCellRenderer
和TableCellEditor
。它被初始化爲0到100的值。JTable中的JSlider
我有一個奇怪的行爲,當我第一次點擊onta滑塊時,它跳到最大值。
第二個奇怪的行爲:我添加了一個ChangeListener
。如果我第一次點擊滑塊,這個監聽器只會被調用。第二次點擊(也會更改該值)不會導致此事件。爲什麼?
public class SliderTableColumn extends AbstractCellEditor implements TableCellRenderer,
TableCellEditor
{
private final JSlider slRenderer;
private final JSlider slEditor;
private final int INITAL_VALUE;
private final int MIN_VLAUE;
private final int MAX_VALUE;
public SliderTableColumn(int min, int max, int initial, ChangeListener listener)
{
INITAL_VALUE = initial;
MIN_VLAUE = min;
MAX_VALUE = max;
slRenderer = new JSlider(MIN_VLAUE, MAX_VALUE);
slEditor = new JSlider(MIN_VLAUE, MAX_VALUE);
slEditor.addChangeListener(listener);
slRenderer.setUI(new CustomSliderUI(slRenderer, INITAL_VALUE));
slEditor.setUI(new CustomSliderUI(slEditor, INITAL_VALUE));
slRenderer.setValue(INITAL_VALUE);
slEditor.setValue(INITAL_VALUE);
}
@Override
public Object getCellEditorValue()
{
return slEditor.getValue();
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
if(value != null)
{
slRenderer.setValue(((Integer) value).intValue());
}
return slRenderer;
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column)
{
if(value != null)
{
slEditor.setValue(((Integer) value).intValue());
}
return slEditor;
}
}
謝謝。第2點是固定的。問題1似乎是別的。我正在使用scrollDueToClickInTrack()跳轉到當前位置。這在內部使用trackRect.width,它第一次有錯誤的值。再次單擊滑塊,它將被正確初始化,並且滑塊跳到正確的位置。 – Razer 2012-01-14 12:50:41
我很困惑。它看起來像你的編輯器已經'setValue()'。 – trashgod 2012-01-14 20:15:49
我只是通過在'scrollDueToClickInTrack()之前調用'super.calculateGeometry()'來修復它。這會計算出正確的tracRect,並且這個跳轉到一個位置起作用。 – Razer 2012-01-14 20:22:52