2016-01-24 38 views
0

我有一個名爲quantitySl的JSlider對象和名爲quantitySp的JSpinner對象。當有人更改微調器時,我想將滑塊更改爲相同的值,反之亦然。將JSlider值更改爲JSpinner值,反之亦然

對象的初始化如下:

SpinnerNumberModel quantityLimiter = new SpinnerNumberModel(1, 0, 20, 1); 
JSpinner quantitySp = new JSpinner(quantityLimiter); 
JSlider quantitySl = new JSlider(0,20,1); 
quantitySl.addChangeListener(this); 
quantitySp.addChangeListener(this); 

這是與我試圖改變數值的代碼:

@Override 
public void stateChanged(ChangeEvent ce) { 
     if(ce.getSource()==quantitySp){ 
      quantitySp.setValue(quantitySl.getValue()); 
     } 
     else if(ce.getSource()==quantitySl){ 
      quantitySl.setValue((int) quantitySp.getValue()); 
     } 
} 

的問題是,改變的價值微調器會觸發它的statechanged事件,導致這兩個輸入字段都被鎖定。我該如何解決這個問題?

回答

1

嘗試添加單獨的偵聽爲這樣的每個組件:

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

@SuppressWarnings("serial") 
public class Main extends JFrame 
{ 
    private JSlider slider; 
    private JSpinner spinner; 
    private int min, max; 

    public Main() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 400, 200); 
     initializeComponents(); 
     setVisible(true); 
    } 

    public void initializeComponents() 
    { 
     min = 0; 
     max = 100; 
     slider = new JSlider(JSlider.HORIZONTAL, min, max, min); 
     slider.setMajorTickSpacing(10); 
     slider.setMinorTickSpacing(1); 
     slider.setPaintTicks(true); 
     slider.setPaintLabels(true); 
     spinner = new JSpinner(new SpinnerNumberModel(min, min, max, 1)); 

     slider.addChangeListener(new ChangeListener() 
     { 
      @Override 
      public void stateChanged(ChangeEvent e) 
      { 
       spinner.setValue(slider.getValue()); 
      } 
     }); 

     spinner.addChangeListener(new ChangeListener() 
     { 
      @Override 
      public void stateChanged(ChangeEvent e) 
      { 
       slider.setValue((int) spinner.getValue()); 
      } 
     }); 

     add(slider, BorderLayout.NORTH); 
     add(spinner, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 

       try 
       { 
        UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } 
       catch (ClassNotFoundException | InstantiationException 
         | IllegalAccessException 
         | UnsupportedLookAndFeelException e) 
       { 
       } 
       new Main(); 
      } 
     }); 
    } 
} 
相關問題