首页 > 解决方案 > 如何创建允许非整数值的 JSlider?

问题描述

我目前正在JSliderMATLAB UI 中创建 Java Swing。我的滑块的最小值和最大值分别为 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)不可行,我应该使用更好的控件来代替滑块吗?

标签: javamatlabswingjslider

解决方案


我想出了一个最适合我正在尝试做的事情的答案。它类似于之前提出的缩放想法:

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;

这不是解决问题的超级优雅的解决方案,但希望它也能帮助其他人。


推荐阅读