java中的比例依赖JSpinners

时间:2015-01-23 16:46:19

标签: java swing jspinner

我想在java swing中创建两个微调器,它们将是相互依赖的比例,所以当我改变一个微调器的值时,第二个微调器的值也会改变。 当我为每个微调器编写监听器时,创建了循环。我尝试使用SpinnerModel,但我不知道如何为每个微调器设置各种值。感谢您的回复。

1 个答案:

答案 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;
   }

}