我想在java swing中创建两个微调器,它们将是相互依赖的比例,所以当我改变一个微调器的值时,第二个微调器的值也会改变。 当我为每个微调器编写监听器时,创建了循环。我尝试使用SpinnerModel,但我不知道如何为每个微调器设置各种值。感谢您的回复。
答案 0 :(得分:2)
为什么不编写可以关闭和打开的更改侦听器。因此,当在一个侦听器上检测到更改时,关闭另一个微调器的侦听器,然后在设置第二个模型后再将其重新打开。
例如,
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TiedSpinnerChangeListeners extends JPanel {
public static final int SPINNER_RATIO = 5;
public static final int SPINNER_1_MAX = 100;
public static final int SPINNER_2_MAX = SPINNER_1_MAX * SPINNER_RATIO;
private JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0, 0,
SPINNER_1_MAX, 1));
private JSpinner spinner2 = new JSpinner(new SpinnerNumberModel(0, 0,
SPINNER_2_MAX, SPINNER_RATIO));
public TiedSpinnerChangeListeners() {
add(spinner1);
add(spinner2);
TiedSpinnerListener spinnerListener1 = new TiedSpinnerListener(spinner2, false);
TiedSpinnerListener spinnerListener2 = new TiedSpinnerListener(spinner1, true);
spinnerListener1.setSecondSpinnerListener(spinnerListener2);
spinnerListener2.setSecondSpinnerListener(spinnerListener1);
spinner1.addChangeListener(spinnerListener1);
spinner2.addChangeListener(spinnerListener2);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new TiedSpinnerChangeListeners());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class TiedSpinnerListener implements ChangeListener {
private TiedSpinnerListener secondSpinnerListener;
private JSpinner secondSpinner;
private boolean listenerOn = true;
private boolean largerValue;
public TiedSpinnerListener(JSpinner secondSpinner,
boolean largerValue) {
this.secondSpinner = secondSpinner;
this.largerValue = largerValue;
}
@Override
public void stateChanged(ChangeEvent e) {
if (!listenerOn) {
return;
}
secondSpinnerListener.setListenerOn(false);
int value = ((Integer) ((JSpinner) e.getSource()).getValue()).intValue();
int newValue = largerValue ? value
/ TiedSpinnerChangeListeners.SPINNER_RATIO : value
* TiedSpinnerChangeListeners.SPINNER_RATIO;
secondSpinner.setValue(newValue);
secondSpinnerListener.setListenerOn(true);
}
public void setSecondSpinnerListener(TiedSpinnerListener secondSpinnerListener) {
this.secondSpinnerListener = secondSpinnerListener;
}
public boolean isListenerOn() {
return listenerOn;
}
public void setListenerOn(boolean listenerOn) {
this.listenerOn = listenerOn;
}
}