【问题标题】:JSlider in JTableJTable中的JSlider
【发布时间】:2012-02-09 21:48:17
【问题描述】:

为了将JSlider 放入JTable,我写的是AbstractCellEditor,它实现了TableCellRendererTableCellEditor。它使用 0 到 100 的值进行初始化。

我有一个奇怪的行为,当我第一次点击一个滑块时,它会跳到最大值。

第二个奇怪的行为:我添加了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;
    }
}

【问题讨论】:

    标签: swing jtable jslider tablecellrenderer tablecelleditor


    【解决方案1】:

    没有你的sscce,我在猜测;但我可以建议两件事进行批判性检查:

    1. getTableCellEditorComponent() 中,实际参数value 来自您的表模型。您的setValue() 调用将value 转发到滑块的范围模型。超出范围的value 被固定到extreme

    2. 你的ChangeListener需要fireEditingStopped(),如相关exampleItemListener所示。

    【讨论】:

    • 谢谢。第 2 点是固定的。问题 1 似乎是另一回事。我正在使用 scrollDueToClickInTrack() 跳转到当前位置。这在内部使用 trackRect.width 第一次具有错误的值。第二次点击滑块,初始化向右,滑块跳到正确的位置。
    • 我很困惑。看起来你的编辑已经做了setValue()
    • 我刚刚通过在 `scrollDueToClickInTrack() 之前调用 super.calculateGeometry() 来修复它。这会计算正确的 tracRect 并且跳转到一个位置有效。
    • 很高兴你把它整理好了,但我很好奇:为什么要覆盖scrollDueToClickInTrack()
    • scrollDueToClickInTrack()通常只增加滑块。我希望滑块直接跳到点击的位置。
    猜你喜欢
    • 2011-01-11
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多