Java/swing/サンプル/JSliderサンプル プログラムから操作する時にイベントを発生させない


サンプルダウンロード JSliderSample6.java

プログラムからスライダを操作した時にイベントを発生させない(キャッチしない)サンプル

一時的にイベントを発生させない方法が分からなかったので、
イベントが発生する直前にリスナーを削除、
処理が終わったらリスナーを戻すようにしました。
@Override
  public void actionPerformed(ActionEvent e) {
    // ChangeListenerを削除してから値を設定し、再度ChangeListenerを設定すると、
    // ChangeListenerでイベントをキャッチできなくなります。
    slider.removeChangeListener(this);
    slider.setValue(0);
    slider.addChangeListener(this);
  }
 

mp3プレイヤーサンプルのシークバーに使いました。

サンプル JSliderSample6.java

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
// JSliderサンプル6
// プログラムからスライダを操作した時にイベントを発生させない(キャッチしない)サンプル
// 一時的にイベントを発生させない方法が分からなかったので、イベントが発生する直前にリスナーを削除して
// 処理が終わったらリスナーを戻すようにしました。
// mp3プレイヤーサンプルのシークバーに使いました。
public class JSliderSample6 extends JFrame implements ActionListener, ChangeListener {
  public static void main(String[] args) {
    new JSliderSample6();
  }
 
  public JSliderSample6() {
    setTitle("JSliderサンプル プログラムからスライダを操作する時に、イベントを発生させない");
    setBounds(200, 100, 410, 110);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new FlowLayout());
 
    init();
 
    setVisible(true);
  }
 
  JSlider slider = new JSlider();
  JTextField textField = new JTextField(10);
  JButton button1 = new JButton("ボタン1");
  JButton button2 = new JButton("ボタン2");
 
  private void init() {
    add(new JLabel("プログラムからスライダを操作する時に、イベントを発生させない"));
    slider.addChangeListener(this);
    textField.setText("" + slider.getValue());
    add(slider);
    add(textField);
    add(button1);
    add(button2);
 
    button1.addActionListener(this);
    button2.addActionListener(this);
  }
 
  @Override
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == button2) {
      // ボタン2の場合
      // ChangeListenerを削除してから値を設定し、再度ChangeListenerを設定すると、
      // ChangeListenerでイベントをキャッチできなくなります。
      slider.removeChangeListener(this);
      slider.setValue(0);
      slider.addChangeListener(this);
    } else {
      // ボタン2の場合
      slider.setValue(0);
    }
  }
 
  @Override
  public void stateChanged(ChangeEvent e) {
    textField.setText("" + slider.getValue());
  }
}