Java 使用复选框链接两个JSlider

Java 使用复选框链接两个JSlider,java,eclipse,user-interface,jslider,Java,Eclipse,User Interface,Jslider,我正在开发一个JavaGUI,我有两个JSlider,我想使用复选框连接它们。具体地说,当选中复选框并将其中一个滑块向一个方向滑动时,我希望另一个滑块向相反方向移动。两个滑块都从-5变为+5,默认值为0。 不幸的是,我不知道该怎么做,到目前为止,我找不到任何解决这个问题的方法。 这是到目前为止的代码。我真的非常感谢任何关于这方面的帮助 JSlider sliderFilter1 = new JSlider(-5, 5, 0); sliderFilter1.setPaintTicks(tr

我正在开发一个JavaGUI,我有两个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的。

1。不要使用
setBounds
,这表明您使用的是一个永远不可建议的
null
布局。2.当
sliderFilter1
更改时,它将更改
sliderFilter2
,这将依次更改
sliderFilter1
,后者将依次更改
sliderFilter2
。。。做这样的事情时你应该小心;)非常感谢你@Parker Hoyes,成功了!实际上,我使用WindowBuilder for eclipse进行布局,但它在某个时候崩溃了,现在我无法再打开设计页面了,这就是为什么我被整个挫折所困扰的原因。