我正在使用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);
答案 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。