JTable中的JSlider [英] JSlider in JTable
问题描述
为了将JSlider
放入JTable
中,我写了AbstractCellEditor
,它实现了TableCellRenderer
和TableCellEditor
.它将使用0到100的值进行初始化.
For putting a JSlider
into a JTable
I wrote am AbstractCellEditor
which implements a TableCellRenderer
and a TableCellEditor
. It gets initialized with values from 0 to 100.
我有一个奇怪的行为,当我第一次单击一个滑块时,它会跳到最大.
I have the strange behaviour that when I first click onta a slider it jumps to the maximum.
第二个怪异行为:我添加了ChangeListener
.仅当我第一次单击滑块时,才会调用此侦听器.再次单击(也会更改值)不会导致此事件.为什么?
The second weird behaviour: I've added a ChangeListener
. This Listener gets only called if I first click into the slider. A second click (which also changes the value) doesn't cause this event. Why?
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;
}
}
推荐答案
我在推测您的 sscce .但我可以建议您认真审查两件事:
Absent your sscce, I'm speculating; but I can suggest two things to examine critically:
-
在
getTableCellEditorComponent()
中,实际参数value
来自表模型.您的setValue()
调用会将value
转发到滑块的范围模型.超出范围的value
固定到极端.
In
getTableCellEditorComponent()
, the actual parametervalue
comes from your table model. YoursetValue()
invocation forwards thevalue
to the slider's range model. An out-of-rangevalue
is pinned to the extreme.
您的ChangeListener
需要fireEditingStopped()
,如此相关
查看全文