swing - JTable 中的 JSlider

标签 swing jtable jslider tablecellrenderer tablecelleditor

为了将 JSlider 放入 JTable 中,我编写了 AbstractCellEditor ,它实现了 TableCellRenderer >表格单元格编辑器。它使用 0 到 100 之间的值进行初始化。

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

第二个奇怪的行为:我添加了一个 ChangeListener。仅当我第一次单击 slider 时才会调用此监听器。第二次单击(也会更改值)不会导致此事件。为什么?

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 ,我在猜测;但我可以建议仔细检查两件事:

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

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

关于swing - JTable 中的 JSlider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854841/

相关文章:

java - jpopupmenu menuitem actionperformed 未触发

java - 如何使用 jgoodies 表单最大化组件高度

java - 失去对 JTable 单元格的选择

java - 需要行动监听者的建议

Java JSlider精度问题

java - 更改 JSlider 的单位移动

java - 更改 JFrame 的内容 Pane 后聚焦组件

java - 增加 Swing 中标题栏的大小

java - 如何在 JTable 中动态设置 RowHeight

java - JTable 排序表的选择间隔问题