link 两个使用复选框的 JSlider

link two JSliders using a checkbox

我正在开发 java GUI,我有两个 JSlider,我想使用复选框连接它们。具体来说,当复选框被选中并且我向一个方向滑动其中一个滑块时,我希望另一个滑块向相反的方向移动。两个滑块都从 -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);

通过使用 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.