【问题标题】:Jslider should fire change event when it come to restJslider 应该在休息时触发更改事件
【发布时间】:2013-09-12 06:28:02
【问题描述】:

我的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);  

这段代码给出了滑块的连续变化值。

但我想要滑块的静止位置值。 我应该写什么来获得仅用于休息位置的值?

【问题讨论】:

    标签: java swing jslider


    【解决方案1】:

    我们也可以使用

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

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

    【讨论】:

      【解决方案2】:

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

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

      因为我们不想阻塞事件调度线程,因为它会阻止处理任何新事件,所以我使用了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,从长远来看,它会为你省去很多心痛;)

      【讨论】:

        猜你喜欢
        • 2013-03-28
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-18
        • 2018-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多