我有一个带有附加ChangeListerner的简单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中向控制台打印一些东西。
但是每次更改Slider时,上面的代码都会打印两次“boo”。我猜这与Slider上的Mouse Release有关,但不管它是什么,我希望它只触发一次事件,因此只打印一次这个词。
我怎样才能做到这一点?
由于
答案 0 :(得分: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 );
}
} );
}
}
答案 1 :(得分:-1)
我知道这个问题。我的解决方法是将全局eventOnwer设置为所有其他侦听器,
这解决了一个事件所有者发生时发生的其他事件。
然后,为解决滑块,我在getValueIsAdjusting()
中将if
设置为true。万一再起火,return
。