2013-04-05 3 views
2

첨부 된 ChangeListerner가있는 간단한 JSlider가 있습니다. 당신이 볼 수 있듯이, 코드가 많이 안하고JSlider 이벤트 두 번 실행

JSlider slider = new JSlider(); 
slider.setMinorTickSpacing(2); 
slider.setMajorTickSpacing(20); 
slider.setPaintLabels(true); 
slider.setPaintTicks(true); 
slider.setSnapToTicks(true); 
slider.setOrientation(SwingConstants.VERTICAL); 
contentPane.add(slider, BorderLayout.CENTER); 

slider.addChangeListener(new SliderListener()); 

class SliderListener implements ChangeListener { 
    public void stateChanged(ChangeEvent e) { 
     JSlider source = (JSlider)e.getSource(); 
     if (!source.getValueIsAdjusting()) { 
      System.out.println("boo"); 
     }  
    } 
} 

, 내가 지금하고 싶은 모든 이벤트가 한 번만 발사되어 있는지 확인하고, 따라서 내 이벤트가 뭔가를 인쇄하는 것입니다 : 여기에 코드는 Eclipse 내에서 Console로 이동하십시오.

그러나 위 코드는 슬라이더를 변경할 때마다 "부"를 두 번 인쇄합니다. 나는 이것이 Slider의 Mouse Release와 관련이 있다고 생각하지만, 그것이 무엇이든간에, 나는 이벤트를 한 번만 발사하고 단어를 한 번만 인쇄하기를 원한다.

어떻게하면됩니까?

감사합니다.

+0

기본적으로이 슬라이더 만있는 프로그램을 만들려고했는데 문제가 중복 될 수 있는지 확인 했습니까? –

+0

전체 코드를 여기에 넣으면 코드를 이해하는 것이 훨씬 낫습니다. –

+0

@ PM77-1 내 전체 프로그램이 그 것입니다! 기본적으로 JSlider입니다. 나는 행동에 대한 좀 더 구체적인 정보를 알아 냈다. 슬라이더를 틱 레이블 사이의 위치로 이동하면됩니다. 코드가 업데이트되었습니다. – Ciwan

답변

2

청취자가 두 번 추가되지 않았습니까? 다음 SSCCE는 내 컴퓨터 (OS X, JDK7)에서 예상대로 작동합니다.

import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.WindowConstants; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import java.awt.EventQueue; 

public class SliderTest { 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     JFrame frame = new JFrame(); 
     final JSlider slider = new JSlider(0, 100); 
     frame.add(slider); 
     slider.addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
      if (!(slider.getValueIsAdjusting())){ 
       System.out.println("SliderTest.stateChanged"); 
      } 
      } 
     }); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     } 
    }); 
    } 
} 
+3

OP는 그가 ** 틱스 ** 페인트를하고'setSnapToTicks'가 'True'로 설정되고 슬라이더가 ** 진드기 사이에 ** 중단되었습니다. 이 경우에는 슬라이더를 가장 가까운 틱으로 조정하기 위해 두 번째 이벤트가 자동으로 실행됩니다. –