为了将JSlider放入JTable,我编写了AbstractCellEditor,它实现了TableCellRenderer和TableCellEditor。它使用0到100之间的值进行初始化。
我有一个奇怪的行为,当我第一次单击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;
}
}发布于 2012-01-14 10:57:40
没有你的sscce,我在猜测;但我可以建议两件事来批判性地检查:
getTableCellEditorComponent()中,实际的参数value来自您的表模型。您的setValue()调用将value转发到滑块的范围模型。将超出范围的value固定到extreme.ChangeListener needs to fireEditingStopped(),如此相关value的ItemListener中所示https://stackoverflow.com/questions/8854841
复制相似问题