基于范围的滑块(控制两端)

时间:2015-03-15 14:26:30

标签: matlab

您好我正在寻找一种在matlab中生成滑块的简洁方法,它允许我调整范围的两端。我希望能够控制滑块的终点,而不是拖动单个值。

我可以使用两个带有Matlab的滑块完成此操作,但我想知道是否有任何方法可以将它组合成一个控件

显示我想要的滑块的示例。

http://demos.jquerymobile.com/1.3.0-rc.1/docs/demos/widgets/sliders/rangeslider.html

2 个答案:

答案 0 :(得分:1)

这可以通过使用Swing以及Matlabs handlejavacomponent函数使用第三方Java jar来实现。我已经从JIDE Common Layer (Open Source)

改编了这个

显然Matlab可以使用标准的Swing组件。这在Undocumented Matlab上进行了讨论。

你最终会得到一个如下所示的滑块:

Slider Example

以下是代码:

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值,则在相应更新其余两个值之前,它不会呈现。当然同样适用于最大值。

希望这会有所帮助。