使用复选框链接两个JSliders

时间:2015-05-27 23:17:16

标签: java eclipse user-interface jslider

我正在使用java GUI,我有两个JSliders,我想连接,使用复选框。具体来说,当选中复选框并沿一个方向滑动其中一个滑块时,我希望另一个滑块向相反方向移动。两个滑块都从-5到+5,默认值为0。 不幸的是,我不知道该怎么做,到目前为止我找不到解决这个问题的方法。 到目前为止,这是守则。我真的很感激这方面的任何帮助。

JSlider sliderFilter1 = new JSlider(-5, 5, 0);
    sliderFilter1.setPaintTicks(true);
    sliderFilter1.setMajorTickSpacing(1);
    sliderFilter1.setBounds(10, 459, 200, 32);
    add(sliderFilter1);

    JSlider sliderFilter2 = new JSlider(-5, 5, 0);
    sliderFilter2.setMajorTickSpacing(1);
    sliderFilter2.setPaintTicks(true);
    sliderFilter2.setBounds(10, 503, 200, 32);
    add(sliderFilter2);

    JCheckBox chckbxConnectSlider = new JCheckBox("Connect Slider");
    chckbxConnectSlider.setBounds(6, 547, 131, 23);
    add(chckbxConnectSlider);

1 个答案:

答案 0 :(得分:0)

通过使用ChangeListener,您可以编码一个滑块,根据其更改时的值更新另一个滑块。

final JSlider sliderFilter1;
final JSlider sliderFilter2;
final JCheckBox chckbxConnectSlider;

sliderFilter1 = new JSlider(-5, 5, 0);
sliderFilter1.setPaintTicks(true);
sliderFilter1.setMajorTickSpacing(1);
sliderFilter1.setBounds(10, 459, 200, 32);
add(sliderFilter1);

sliderFilter2 = new JSlider(-5, 5, 0);
sliderFilter2.setMajorTickSpacing(1);
sliderFilter2.setPaintTicks(true);
sliderFilter2.setBounds(10, 503, 200, 32);
add(sliderFilter2);

chckbxConnectSlider = new JCheckBox("Connect Slider");
chckbxConnectSlider.setBounds(6, 547, 131, 23);
add(chckbxConnectSlider);

sliderFilter1.addChangeListener(new ChangeListener() {
    private int lastValue = 0;
    @Override
    public void stateChanged(ChangeEvent e) {
        JSlider source = (JSlider) e.getSource();
        if (lastValue != ((int) source.getValue()) && chckbxConnectSlider.isSelected()) {
            lastValue = (int) source.getValue();
            sliderFilter2.setValue(-((int) source.getValue()));
        }
    }
});
sliderFilter2.addChangeListener(new ChangeListener() {
    private int lastValue = 0;
    @Override
    public void stateChanged(ChangeEvent e) {
        JSlider source = (JSlider) e.getSource();
        if (lastValue != ((int) source.getValue()) && chckbxConnectSlider.isSelected()) {
            lastValue = (int) source.getValue();
            sliderFilter1.setValue(-((int) source.getValue()));
        }
    }
});

请注意,组件必须声明为final,以便可以从匿名函数访问它们。

更新: @MadProgrammer说这会导致一些递归问题(这很令人尴尬)。我已更新代码以执行检查是否实际需要更改值。使用实际布局管理器而不是按位置布置组件也是一个好主意。请参阅Oracle的A Visual Guide to Layout Managers