java - 如何创建允许非整数值的 JSlider?
问题描述
我目前正在JSlider
MATLAB 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)不可行,我应该使用更好的控件来代替滑块吗?
解决方案
我想出了一个最适合我正在尝试做的事情的答案。它类似于之前提出的缩放想法:
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;
这不是解决问题的超级优雅的解决方案,但希望它也能帮助其他人。
推荐阅读
- reactjs - jsx 元素类型 xx 没有任何构造或调用签名
- javascript - 以所需格式格式化 json 数组
- python-3.x - Linux 上的 Selenium:selenium.common.exceptions.WebDriverException:消息:“chromedriver_linux64”可执行文件可能具有错误的权限
- spring-mvc - spring-security:spring-mvc web 应用程序的多个身份验证提供程序
- jquery - 复制动态代码并将其显示在对话框中
- django - Django Channels,即时实例化一个新的消费者,没有链接到 Websocket 或其他协议?
- excel - 使用 PowerShell 将范围从一个工作簿表复制到另一个工作簿表
- sql - 根据我在 SQL Server 2016 中给出的时区格式化日期
- python - PyInstaller:ValueError:模块文件...丢失
- android - System.err:调用 js 方法 onCreate 失败 - 缺少主条目。应用程序无法启动。验证应用引导程序