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.
我正在开发 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.