3

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");
        }    
    }
}

ご覧のとおり、コードはあまり機能していません。ここでやりたいことは、イベントが 1 回だけ発生することを確認することだけです。したがって、私のイベントは、Eclipse 内のコンソールに何かを出力するだけです。

しかし、上記のコードは、Slider を変更するたびに「boo」を 2 回出力しています。これは Slider の Mouse Release と関係があると思いますが、それが何であれ、イベントを 1 回だけ発生させて、単語を 1 回だけ出力したいのです。

どうすればそれを達成できますか?

ありがとう

4

2 に答える 2

3

リスナーが 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 );
      }
    } );
  }
}
于 2013-04-05T17:45:17.447 に答える