我的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);
此代码提供滑块的连续更改值。
但我想要滑块的静止位置值。 我应该写什么才能获得剩余位置的值?
答案 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,从长远来看,它会为你节省很多心痛;)