Frage

Für das Platzen a JSlider in ein JTable Ich schrieb am AbstractCellEditor was impliziert a TableCellRendererund 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;
    }
}
War es hilfreich?

Lösung

Abwesend dein SSCCE, Ich spekuliere; Aber ich kann zwei Dinge vorschlagen, um kritisch zu untersuchen:

  1. Im getTableCellEditorComponent(), der tatsächliche Parameter value Kommt aus Ihrem Tabellenmodell. Dein setValue() Invocation leitet die value zum Bereich des Schiebereglers. Ein außergewöhnlicher value ist an die festgehalten extrem.

  2. Dein ChangeListener muss fireEditingStopped(), wie in der gezeigt ItemListener von diesem verwandten Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top