Java JSlider事件触发两次

Java JSlider事件触发两次,java,swing,jslider,changelistener,Java,Swing,Jslider,Changelistener,我有一个简单的JSlider和一个附加的ChangeListerner。代码如下: JSlider slider = new JSlider(); slider.setMinorTickSpacing(2); slider.setMajorTickSpacing(20); slider.setPaintLabels(true); slider.setPaintTicks(true); slider.setSnapToTicks(true); slider.setOrientation(Swing

我有一个简单的JSlider和一个附加的ChangeListerner。代码如下:

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中向控制台打印一些东西

但是上面的代码在我每次更改滑块时都会打印两次“boo”。我猜这与滑块上的鼠标释放有关,但不管是什么,我希望它只触发一次事件,因此只打印一次单词

我怎样才能做到这一点


谢谢

您确定没有添加两次侦听器吗?以下SSCCE在我的机器(OS X、JDK7)上按预期工作


我知道这个问题。我的解决方法是将全局EventOnPower设置为所有其他侦听器, 它解决了当一个是事件所有者时发生的其他事件激发。
然后,为了解决滑块问题,我将
if
中的
getValueIsAdjusting()
设置为true。如果发生另一次火灾,
return

您是否尝试创建一个基本上只有此滑块的程序,并查看是否可以复制该问题?如果您将整个代码放在此处,了解您的代码会更好。@PM77-1我的整个程序就是这样!基本上是一个JSlider。我已经找到了一些关于这种行为的更具体的信息。仅当我将滑块移动到刻度标签之间的位置时,它才会执行此操作。代码更新。@Ciwan-社区似乎都知道这个案例。请参阅下面的讨论:将changeEvent视为一把猎枪——它在多个触发器上触发,从广义上讲,在侦听器中对此您无能为力。相反,要防止触发的依赖更改(填充println的“真实”代码)重复,如果当前状态不受通知影响,则不执行任何操作。OP澄清,当他绘制了记号,并且
setSnapToTicks
设置为
True
并且滑块在记号之间停止时,会发生这种情况。显然,在这种情况下,会自动触发第二个事件,以便将滑块调整到最近的刻度。
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 );
      }
    } );
  }
}