Domanda

Per mettere un JSlider in un JTable Ho scritto AM AbstractCellEditor che implementa a TableCellRenderere 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;
    }
}
È stato utile?

Soluzione

Assente il tuo SSCCE, Sto speculando; Ma posso suggerire due cose da esaminare criticamente:

  1. In getTableCellEditorComponent(), il parametro effettivo value Viene dal tuo modello da tavolo. Tuo setValue() L'invocazione inoltra il value al modello di gamma del cursore. Un fuori dal raggio value è bloccato a estremo.

  2. Tuo ChangeListener deve fireEditingStopped(), come mostrato in ItemListener di questo correlato esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top