質問

置くため JSliderJTable 私はamを書いた AbstractCellEditor これはaを実装します TableCellRendererそしてa TableCellEditor. 。 0から100の値で初期化されます。

最初にスライダーをオンタリオでクリックすると、最大値にジャンプするという奇妙な動作があります。

2番目の奇妙な動作:私は追加しました ChangeListener. 。このリスナーは、最初にスライダーをクリックすると呼び出されます。 2回目のクリック(値も変更)はこのイベントを引き起こしません。なんで?

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;
    }
}
役に立ちましたか?

解決

あなたがいない sscce, 、推測しています。しかし、私は批判的に調べるために2つのことを提案することができます:

  1. getTableCellEditorComponent(), 、実際のパラメーター value テーブルモデルから来ています。君の setValue() 呼び出しは転送されます value スライダーの範囲モデルへ。範囲外 value に固定されています 過激.

  2. 君の ChangeListener する必要がある fireEditingStopped(), 、に示されているように ItemListener これの関連 .

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top