2013-10-03 2 views
1

JSpinner의 change 이벤트에서 코드가 두 번 입력되는 이유는 무엇입니까?JSpinner stateChanged는 어떻게 작동합니까?

private javax.swing.JSpinner spinner = new javax.swing.JSpinner() 
spinner.setModel(new javax.swing.SpinnerDateModel()); 
    spinner.addChangeListener(new javax.swing.event.ChangeListener() { 
     @Override 
     public void stateChanged(javax.swing.event.ChangeEvent evt) { 
      System.out.println("Just a test"); 
     } 
    }); 

위 코드는 한 번만 클릭하면 메시지가 두 번 표시됩니다.

+0

빈 값으로 모델을 생성하고 있습니다. 한 번만 인쇄하면 안됩니다. 나는 그것에 대해 확신한다. – Sage

답변

3

2 개의 이벤트가 생성됩니다. 하나는 값이 선택 취소되고 다른 하나는 구성 요소에서 선택된 새 값입니다. @camickr 그의 의견에 지적으로이 동작은 당신이 늘 청취자를 방지

spinner.addChangeListener(new ChangeListener() { 

    Object lastValue; 

    @Override 
    public void stateChanged(ChangeEvent evt) { 

     if (lastValue != null && !spinner.getValue().equals(lastValue)) { 
      // expensive code calls here! 
     } 
     lastValue = spinner.getValue(); 
    } 
}); 

를 사용할 수 두 번 호출되고 있지만 모든 비용을 방지하는 해결 방법으로 기본 SpinnerNumberModel

SpinnerDateModel에서 발생하지만 코드가 불필요하게 호출됩니다.

+0

예, 두 개의 이벤트를 생성하는 것으로 생각했습니다. 하나는 새 이벤트 용 이벤트이고, 하나는 새 이벤트 용 이벤트입니다.하지만 스피너를 처음 클릭 할 때 청취자가 두 번만 호출되는 것으로 나타났습니다. 그 후에는 한 번만 호출됩니다. 또한 SpinnerDateModel에만 적용되며 SpinnerNumberModel에는 적용되지 않습니다 (테스트 기준). – camickr

+0

+1 모든 경우에 문제가 해결 될 것입니다. – camickr

+0

코드를 테스트하고 첫 번째 클릭 문제가 발생해도 문제없이 작동합니다. 그러나 나는 스피너에서 커서의 위치를 ​​변경하고 다시 클릭 할 때 동일한 문제를 발견했다. 문제는 다시 발생합니다. 회전 할 때마다 커서가 바뀝니다. –