JTable中的JSlider [英] JSlider in JTable

查看:108
本文介绍了JTable中的JSlider的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

For putting a JSlider into a JTable I wrote am AbstractCellEditor which implements a TableCellRendererand a TableCellEditor. It gets initialized with values from 0 to 100.

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

I have the strange behaviour that when I first click onta a slider it jumps to the maximum.

第二个怪异行为:我添加了ChangeListener.仅当我第一次单击滑块时,才会调用此侦听器.再次单击(也会更改值)不会导致此事件.为什么?

The second weird behaviour: I've added a ChangeListener. This Listener gets only called if I first click into the slider. A second click (which also changes the value) doesn't cause this event. Why?

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 .但我可以建议您认真审查两件事:

Absent your sscce, I'm speculating; but I can suggest two things to examine critically:

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

  1. In getTableCellEditorComponent(), the actual parameter value comes from your table model. Your setValue() invocation forwards the value to the slider's range model. An out-of-range value is pinned to the extreme.

您的ChangeListener需要fireEditingStopped(),如此相关 查看全文

登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆