Jslider in jtable
-
28-10-2019 - |
Domanda
Per mettere un JSlider
in un JTable
Ho scritto AM AbstractCellEditor
che implementa a TableCellRenderer
e a TableCellEditor
. Viene inizializzato con valori da 0 a 100.
Ho lo strano comportamento che quando faccio prima clic su un cursore salta al massimo.
Il secondo comportamento strano: ho aggiunto un ChangeListener
. Questo ascoltatore viene chiamato solo se faccio clic sul cursore. Un secondo clic (che cambia anche il valore) non causa questo evento. Come mai?
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;
}
}
Soluzione
Assente il tuo SSCCE, Sto speculando; Ma posso suggerire due cose da esaminare criticamente:
In
getTableCellEditorComponent()
, il parametro effettivovalue
Viene dal tuo modello da tavolo. TuosetValue()
L'invocazione inoltra ilvalue
al modello di gamma del cursore. Un fuori dal raggiovalue
è bloccato a estremo.Tuo
ChangeListener
devefireEditingStopped()
, come mostrato inItemListener
di questo correlato esempio.