如何创建允许非整数值的JSlider?

时间:2018-07-10 15:39:49

标签: java matlab swing jslider

我当前正在MATLAB UI中创建Java Swing JSlider。我的滑块的最小值和最大值分别为0.0和10.0。我注意到滑块的指针/插入符号/钻石仅捕捉到整数值。即,不可能将滑块设置为例如5.5的值。对于我的应用程序来说,这种行为不是特别理想。

这是我目前的代码:

hFig = figure(1);
hC = uicomponent('style','javax.swing.jslider','position',[10 10 400 200]);
hC.JavaComponent.setPaintLabels(true);
hC.JavaComponent.setPaintTicks(true);
hC.JavaComponent.setMinimum(0);
hC.JavaComponent.setMaximum(10);
hC.JavaComponent.setValue(5);
hC.JavaComponent.setMajorTickSpacing(2);
hC.JavaComponent.setMinorTickSpacing(1);
hC.JavaComponent.SnapToTicks(false);

hC.JavaComponent是对实际Java滑块对象的引用。函数uicomponent()用于在MATLAB图形中实例化Java Swing对象。由于我直接使用Java对象,因此我的直觉是我在MATLAB中工作并不是很重要,但是我可能会错。

因此,我的问题是:

  1. 如何创建允许十进制值的滑块?
  2. 如果(1)不可行,是否应该使用更好的控件代替滑块?

1 个答案:

答案 0 :(得分:0)

我想出了一个最适合我要尝试的答案。这与之前提出的缩放比例概念类似:

function hC = createDecimalSlider(hFig, resolution, position, min, max, value, majorTickSpace, minorTickSpace)
    factor = 1/resolution;

    sMin = min*factor;
    sMax = max*factor;
    sValue = value*factor;
    sMajorTick = majorTickSpace*factor;
    sMinorTick = minorTickSpace*factor;

    hC = uicomponent(hFig, 'style','javax.swing.jslider','position',position);
    hC.JavaComponent.setPaintLabels(true);
    hC.JavaComponent.setPaintTicks(true);
    hC.JavaComponent.setMinimum(sMin);
    hC.JavaComponent.setMaximum(sMax);
    hC.JavaComponent.setValue(sValue);
    hC.JavaComponent.setMajorTickSpacing(sMajorTick);
    hC.JavaComponent.setMinorTickSpacing(sMinorTick);
    hC.JavaComponent.setExtent(0);
    hC.JavaComponent.SnapToTicks(false);

    fH = @(src,evt) setUD(src,evt, hC, factor);
    hC.JavaComponent.StateChangedCallback = fH;
    fH(hC.JavaComponent,[]);

    labels = java.util.Hashtable();
    for(tick = sMin:sMajorTick:sMax)
        num = tick/factor;
        str = num2str(num);
        labels.put(cast(tick,'int32'), javax.swing.JLabel(str));
    end
    hC.JavaComponent.setLabelTable(labels);
end

function setUD(hjSlider,~, hC, factor)
    hC.UserData = hjSlider.getValue()/factor;
end 

将调用该函数并创建滑块,如下所示:

hFig = figure(1);
hC = createDecimalSlider(hFig, 1E-6, [10 10 400 50], 0,10,5.005,1,0.25);

然后按如下方式检索值:

value = hC.UserData;

这不是解决问题的绝妙方法,但希望它也能帮助其他人。