Jslider应该在它休息时发射变化事件

时间:2013-09-12 06:28:02

标签: java swing jslider

我的JAVA应用程序中有一个滑块。我已为该滑块编写了更改侦听器。这是我写的代码

jSlider = new JSlider(JSlider.HORIZONTAL,0,30,2);
        jSlider.setFont(new Font("Dialog", Font.BOLD, 10));
        jSlider.setMinorTickSpacing(1);
        jSlider.setMajorTickSpacing(2);
        jSlider.setPaintTicks(true);
        jSlider.setPaintLabels(true);
        jSlider.setBounds(76, 564, 586, 55);
        jSlider.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent arg0) {
                // TODO Auto-generated method stub
                textField.setText(String.valueOf(jSlider.getValue()));
            }
        });
        getContentPane().add(jSlider);  

此代码提供滑块的连续更改值。

但我想要滑块的静止位置值。 我应该写什么才能获得剩余位置的值?

2 个答案:

答案 0 :(得分:8)

我们也可以使用

jSlider.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                // TODO Auto-generated method stub
                JSlider source = (JSlider)e.getSource();
                if(!source.getValueIsAdjusting())
                {
                    //textField.setText(String.valueOf(source.getValue()));
                    int gain = source.getValue();
                    //System.out.println("***** GAIN ***** "+gain);
                    GetGain g = new GetGain(gain);
                }
            }
        });

上面的代码也给出了滑块静止位置的值。

答案 1 :(得分:2)

基本上,您可以做的是在引发stateChanged事件的时间和textField更新的时间之间插入“强制延迟”。

这基本上意味着我们在最后一次调用stateChanged方法之前等待一段固定的时间,然后我们尝试更新textField

因为我们不想阻止Event Dispatching Thread,因为它会阻止处理任何新事件,所以我使用了javax.swing.Timer

基本上,每当调用stateChanged方法时,我都会重启计时器。一旦事件停止,计时器就可以完成并触发actionPerformed事件,这样我们就可以更新textField ... easy;)

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TestSlider01 {

    public static void main(String[] args) {
        new TestSlider01();
    }

    public TestSlider01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JSlider slider;
        private JTextField textField;

        private Timer slideTimer;

        public TestPane() {

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            textField = new JTextField(20);

            slider = new JSlider(JSlider.HORIZONTAL, 0, 30, 2);
            slider.setFont(new Font("Dialog", Font.BOLD, 10));
            slider.setMinorTickSpacing(1);
            slider.setMajorTickSpacing(2);
            slider.setPaintTicks(true);
            slider.setPaintLabels(true);
            slider.addChangeListener(new ChangeListener() {

                @Override
                public void stateChanged(ChangeEvent arg0) {
//                    textField.setText(String.valueOf(slider.getValue()));
                    slideTimer.restart();
                }
            });
            slideTimer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    textField.setText(String.valueOf(slider.getValue()));
                }
            });
            slideTimer.setRepeats(false);
            add(slider, gbc);
            add(textField, gbc);
        }
    }
}

现在,我故意使用较大的延迟值,你可能希望用它...

此外,setBounds是一个非常糟糕的主意。我会花时间学习布局管理器API,从长远来看,它会为你节省很多心痛;)