Pregunta

Por poner un JSlider en un JTable Yo escribí soy AbstractCellEditor que implementa un TableCellRenderery 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;
    }
}
¿Fue útil?

Solución

Ausente tu SSCCE, Estoy especulando; Pero puedo sugerir dos cosas para examinar críticamente:

  1. En getTableCellEditorComponent(), el parámetro real value proviene de su modelo de mesa. Su setValue() invocación hacia adelante value al modelo de rango del control deslizante. Un fuera de rango value está fijado al extremo.

  2. Su ChangeListener necesita fireEditingStopped(), como se muestra en el ItemListener de este relacionado ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top