2013-04-05 235 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