3

アプリケーションにスライダーが 1 つあり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);  

このコードは、スライダーの連続的に変化する値を提供します。

しかし、スライダーの残りの位置の値が必要です。静止位置のみの値を取得するには何を書けばよいですか?

4

2 に答える 2

9

使用することもできます

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

上記のコードは、スライダーの残りの位置の値も提供します。

于 2013-09-12T09:42:25.707 に答える
2

stateChanged基本的に、イベントが発生してからtextField更新されるまでの間に「強制遅延」を挿入することができます。

これは基本的に、stateChangedメソッドが最後に呼び出されてからtextField.

イベント ディスパッチ スレッドをブロックしたくないため、新しいイベントの処理が停止されるため、javax.swing.Timer.

基本的に、メソッドが呼び出されるたびにstateChanged、タイマーを再起動します。イベントが停止すると、タイマーが完了し、イベントがトリガーされます。これにより、 ...簡単actionPerformedに更新できます;)textField

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 の学習に時間を投資します。長い目で見れば、心痛を大幅に軽減できます ;)

于 2013-09-12T06:36:33.017 に答える