Question

Pour mettre un JSlider dans un JTable j'ai écrit am AbstractCellEditor qui met en œuvre un TableCellRendererand 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;
    }
}
Était-ce utile?

La solution

Absent sscce , je spécule; mais je peux suggérer deux choses à examiner de manière critique:

  1. Dans getTableCellEditorComponent(), le paramètre réel value vient de votre modèle de table. Votre appel de setValue() transmet le value au modèle de gamme du curseur. Un hors de portée value est épinglée à la balise extrême .

  2. Vos besoins de ChangeListener à fireEditingStopped(), comme le montre le ItemListener de ce lié exemple .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top