簡體   English   中英

JSlider 事件觸發兩次

[英]JSlider Event Firing twice

我有一個簡單的 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 中向控制台打印一些內容。

但是每次我更改 Slider 時,上面的代碼都會打印兩次“boo”。 我猜這與 Slider 上的鼠標釋放有關,但無論如何,我希望它只觸發一次事件,因此只打印一次這個詞。

我怎樣才能做到這一點?

謝謝

您確定沒有添加兩次偵聽器嗎? 以下 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 );
      }
    } );
  }
}

我知道這個問題。 我的解決方法是將全局 eventOnwer 設置為所有其他偵聽器,這解決了其他事件觸發的問題,而其中一個是事件所有者。 然后,為了解決滑塊問題,我在if中將getValueIsAdjusting()設置為 true 。 如果再次發生火災, return

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM