java - JSlider 事件触发两次

标签 java swing jslider changelistener

我有一个带有附加 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 上的鼠标释放有关,但不管它是什么,我希望它只触发一次事件,因此只打印一次这个词。

我怎样才能做到这一点?

谢谢

最佳答案

你确定监听器没有被添加两次吗?以下 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 );
      }
    } );
  }
}

关于java - JSlider 事件触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15839961/

相关文章:

java - 从本地复制文件

java - 移动框架的鼠标事件不起作用

java - 更改 JSlider 的单位移动

java - 如何使 JSlider 背景透明?或如何在 JLayeredPane 中正确覆盖 JComponents?

java - 为什么我无法让标签显示文本字段中的文本?

java - 如何将十六进制值从 RGB 添加到 Jpanel

java - 改造全局错误处理

java - 无法使用 Java 类和 Jar 文件找到或加载主类

java - 跳过子项目中的gradle子任务

java - GridBagLayout 将所有对象放在同一个单元格中