2012-01-13 128 views
3

爲了將JSlider轉換爲JTable我寫了AbstractCellEditor,它實現了TableCellRendererTableCellEditor。它被初始化爲0到100的值。JTable中的JSlider

我有一個奇怪的行爲,當我第一次點擊onta滑塊時,它跳到最大值。

第二個奇怪的行爲:我添加了一個ChangeListener。如果我第一次點擊滑塊,這個監聽器只會被調用。第二次點擊(也會更改該值)不會導致此事件。爲什麼?

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; 
    } 
} 

回答

3

缺席您的sscce,我在猜測;但我可以建議兩件事情,嚴格審查:

  1. getTableCellEditorComponent(),實際參數value來自您的表格模型。您的setValue()調用將value轉發給滑塊的範圍模型。超出範圍value被固定到extreme

  2. 您的ChangeListener需要fireEditingStopped(),如的ItemListener所示。

+1

謝謝。第2點是固定的。問題1似乎是別的。我正在使用scrollDueToClickInTrack()跳轉到當前位置。這在內部使用trackRect.width,它第一次有錯誤的值。再次單擊滑塊,它將被正確初始化,並且滑塊跳到正確的位置。 – Razer 2012-01-14 12:50:41

+0

我很困惑。它看起來像你的編輯器已經'setValue()'。 – trashgod 2012-01-14 20:15:49

+1

我只是通過在'scrollDueToClickInTrack()之前調用'super.calculateGeometry()'來修復它。這會計算出正確的tracRect,並且這個跳轉到一個位置起作用。 – Razer 2012-01-14 20:22:52