2013-04-05 157 views
2

我有一个简单的JSlider,附带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中的控制台。

但上面的代码每次更换滑块时都会打印两次“boo”。我猜这与滑鼠上的鼠标释放有关,但无论如何,我希望它只触发一次事件,因此只打印一次。

我该如何做到这一点?

谢谢

+0

您是否尝试过创建基本上只具有此滑块的程序,并查看是否可以重现该问题? – 2013-04-05 17:52:32

+0

如果你把你的整个代码放在这里,理解你的代码会好很多。 – 2013-04-05 18:24:22

+0

@ PM77-1我的整个程序就是这样!基本上是一个JSlider。我已经想出了一些更具体的行为信息。它只会这样做,如果我将滑块移动到刻度标签之间的位置。代码已更新。 – Ciwan 2013-04-05 18:46:32

回答

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'并且滑块是在**之间停止**。显然在这种情况下,第二个事件会自动触发,以便将滑块调整到最接近的刻度。 – 2013-04-05 19:07:11