JSlider dans JTable
-
28-10-2019 - |
Question
Pour mettre un JSlider
dans un JTable
j'ai écrit am AbstractCellEditor
qui met en œuvre un TableCellRenderer
and un TableCellEditor
. Il obtient initialisé avec des valeurs de 0 à 100.
Je le comportement étrange que lorsque je clique sur un curseur onta il saute au maximum.
Le deuxième comportement bizarre: J'ai ajouté un ChangeListener
. Ce Listener ne reçoit que si j'appelle d'abord cliquer sur le curseur. Un second clic (qui modifie également la valeur) ne provoque pas cet événement. Pourquoi?
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;
}
}
La solution
Absent sscce , je spécule; mais je peux suggérer deux choses à examiner de manière critique:
-
Dans
getTableCellEditorComponent()
, le paramètre réelvalue
vient de votre modèle de table. Votre appel desetValue()
transmet levalue
au modèle de gamme du curseur. Un hors de portéevalue
est épinglée à la balise extrême . -
Vos besoins de
ChangeListener
àfireEditingStopped()
, comme le montre leItemListener
de ce lié exemple .