Jslider en jtable
-
28-10-2019 - |
Pregunta
Por poner un JSlider
en un JTable
Yo escribí soy AbstractCellEditor
que implementa un TableCellRenderer
y un TableCellEditor
. Se inicializa con valores de 0 a 100.
Tengo el comportamiento extraño de que cuando hago clic en un control deslizante, salta al máximo.
El segundo comportamiento extraño: he agregado un ChangeListener
. Este oyente solo se llama si hago clic en el control deslizante. Un segundo clic (que también cambia el valor) no causa este evento. ¿Por qué?
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;
}
}
Solución
Ausente tu SSCCE, Estoy especulando; Pero puedo sugerir dos cosas para examinar críticamente:
En
getTableCellEditorComponent()
, el parámetro realvalue
proviene de su modelo de mesa. SusetValue()
invocación hacia adelantevalue
al modelo de rango del control deslizante. Un fuera de rangovalue
está fijado al extremo.Su
ChangeListener
necesitafireEditingStopped()
, como se muestra en elItemListener
de este relacionado ejemplo.