2015-01-23 2 views
2

자바 스윙에서 두 개의 스피너를 만들고 싶습니다. 비례가 서로 의존하므로 하나의 스피너 값을 변경하면 두 번째 스피너 값도 변경됩니다. 각 회 전자에 대한 수신기를 작성하면주기가 작성됩니다. SpinnerModel을 사용해 보았지만 각 회 전자마다 다양한 값을 설정하는 방법을 모르겠습니다. 답변 해 주셔서 감사합니다.비례 의존 자바 스윙의 Jspinners

+0

무한 루프를 방지 스피너의 값이 설정 값과 이벤트를 트리거하기 전에 새로운 값이 이미 유무를 검출한다. – gknicker

+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; 
    } 

} 
+0

대단히 감사합니다 .-) – user3553299