首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTable中的JSlider

JTable中的JSlider
EN

Stack Overflow用户
提问于 2012-01-14 01:41:24
回答 1查看 2.2K关注 0票数 3

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

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

第二个奇怪的行为:我添加了一个ChangeListener。只有当我第一次单击滑块时,才会调用此侦听器。第二次单击(也会改变值)不会导致此事件。为什么?

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-14 10:57:40

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

  1. getTableCellEditorComponent()中,实际的参数value来自您的表模型。您的setValue()调用将value转发到滑块的范围模型。将超出范围的value固定到extreme.
  2. Your ChangeListener needs to fireEditingStopped(),如此相关valueItemListener中所示
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8854841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档