Jslider in jtable
-
28-10-2019 - |
Frage
Für das Platzen a JSlider
in ein JTable
Ich schrieb am AbstractCellEditor
was impliziert a TableCellRenderer
und ein TableCellEditor
. Es wird mit Werten von 0 bis 100 initialisiert.
Ich habe das seltsame Verhalten, dass es beim ersten Klicken auf einen Schieberegler zum Maximum springt.
Das zweite seltsame Verhalten: Ich habe a hinzugefügt ChangeListener
. Dieser Hörer wird nur aufgerufen, wenn ich zum ersten Mal in den Schieberegler klicke. Ein zweites Klick (der auch den Wert ändert) verursacht dieses Ereignis nicht. Wieso den?
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;
}
}
Lösung
Abwesend dein SSCCE, Ich spekuliere; Aber ich kann zwei Dinge vorschlagen, um kritisch zu untersuchen:
Im
getTableCellEditorComponent()
, der tatsächliche Parametervalue
Kommt aus Ihrem Tabellenmodell. DeinsetValue()
Invocation leitet dievalue
zum Bereich des Schiebereglers. Ein außergewöhnlichervalue
ist an die festgehalten extrem.Dein
ChangeListener
mussfireEditingStopped()
, wie in der gezeigtItemListener
von diesem verwandten Beispiel.