您好我正在寻找一种在matlab中生成滑块的简洁方法,它允许我调整范围的两端。我希望能够控制滑块的终点,而不是拖动单个值。
我可以使用两个带有Matlab的滑块完成此操作,但我想知道是否有任何方法可以将它组合成一个控件
显示我想要的滑块的示例。
http://demos.jquerymobile.com/1.3.0-rc.1/docs/demos/widgets/sliders/rangeslider.html
答案 0 :(得分:1)
这可以通过使用Swing以及Matlabs handle
和javacomponent
函数使用第三方Java jar来实现。我已经从JIDE Common Layer (Open Source)
显然Matlab可以使用标准的Swing组件。这在Undocumented Matlab上进行了讨论。
你最终会得到一个如下所示的滑块:
以下是代码:
function [hcomponent, hcontainer] = createSlider
% Add the 3rd Party Jar, should use static path but for the example, we
% use dynamic
javaaddpath('C:\PathToJars\jide_demo.jar')
import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.swing.JideButton;
import com.jidesoft.swing.JideSwingUtilities;
import com.jidesoft.swing.RangeSlider;
import com.jidesoft.swing.SelectAllUtils;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
minField = JTextField();
maxField = JTextField();
SelectAllUtils.install(minField);
SelectAllUtils.install(maxField);
rangeSlider = RangeSlider(-100, 100, -100, 100);
rangeSlider.setPaintTicks(true);
rangeSlider.setPaintLabels(true);
rangeSlider.setPaintTrack(true);
rangeSlider.setRangeDraggable(false);
rangeSlider.setMajorTickSpacing(25);
rangeSlider = handle(rangeSlider, 'CallbackProperties');
function updateValues(~, ~)
minField.setText(num2str(rangeSlider.getLowValue()));
maxField.setText(num2str(rangeSlider.getHighValue()));
end
rangeSlider.StateChangedCallback = @updateValues;
minField.setText(num2str(rangeSlider.getLowValue()));
maxField.setText(num2str(rangeSlider.getHighValue()));
minPanel = JPanel(BorderLayout());
minPanel.add(JLabel('Min'), BorderLayout.BEFORE_FIRST_LINE);
minField.setEditable(false);
minPanel.add(minField);
maxPanel = JPanel(BorderLayout());
maxPanel.add(JLabel('Max', SwingConstants.TRAILING), BorderLayout.BEFORE_FIRST_LINE);
maxField.setEditable(false);
maxPanel.add(maxField);
textFieldPanel = JPanel(GridLayout(1, 3));
textFieldPanel.add(minPanel);
textFieldPanel.add(JPanel());
textFieldPanel.add(maxPanel);
panel = JPanel(BorderLayout());
panel.add(rangeSlider, BorderLayout.CENTER);
panel.add(textFieldPanel, BorderLayout.AFTER_LAST_LINE);
% hcontainer can be used to interact with panel like uicontrol
[hcomponent, hcontainer] = javacomponent(panel, [50, 50, 200, 100], gcf);
end
答案 1 :(得分:0)
首先,您需要在滑块的任一侧创建编辑框。假设f
是图形的句柄,h
是滑块的句柄,你可以这样做:
endval1 = uicontrol('Parent',f,'Style','Edit','Position',[180,10,200,23],'String','Your number here', 'Callback', @(src,event)callback(src,event,h));
当然,将位置更改为适合您需求的位置,并为顶部和底部创建其中两个。
注意我如何使用以下@(src,event)callback(src,event,h)
进行回调。在这里我传递了滑块(h
)的句柄,所以我可以在需要时修改它。
现在进行回调:
function callback(src, event, h)
n = num2str(src.String);
set(h, 'Min', n);
end
这是回调的一个例子。当然,另一端你需要另一个。请注意,如果您的新min
值大于当前滑块值或max
值,则在相应更新其余两个值之前,它不会呈现。当然同样适用于最大值。
希望这会有所帮助。