swing JSlider和JTextField的java设置勾选行为
这是我的GUI:
下面是一个SSCCE,它将产生这样的结果。JSlider
连接到显示0到100之间的值的JTextField
我已经设置了以下参数,使其每隔10秒停止一次。它可以工作,但文本字段在拖动时仍会显示10秒之间的值(如73),然后在松开滑块时进行调整。是否有一种方法可以仅显示十,即使在拖动时也是如此
js.setMinorTickSpacing(10);
js.setSnapToTicks(true);
SSCCE:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.event.*;
import net.miginfocom.swing.MigLayout;
public class SSCCE {
public static void main(String[] args) {
JFrame frame = new JFrame("SSCCE JSlider + JTextField");
JPanel panel = new JPanel(new MigLayout("", "[200!][100!]", ""));
final JSlider js = new JSlider();
final JFormattedTextField tf = new JFormattedTextField(NumberFormat.getNumberInstance());
js.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
tf.setText(String.valueOf(js.getValue()));
}
});
tf.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent ke) {
String typed = tf.getText();
js.setValue(0);
if (!typed.matches("\\d+")) {
return;
}
int value = Integer.parseInt(typed);
js.setValue(value);
}
});
js.setMinorTickSpacing(10);
js.setSnapToTicks(true);
panel.add(js);
panel.add(tf, "grow");
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
# 1 楼答案
只需将当前
JSlider
值四舍五入到最接近的10,然后将JTextField
设置为该数字:还有一个对Concurrency in Swing的读取,特别是对^{} (EDT) ,这要求我们通过^{} 块在EDT上创建和操作所有Swing组件: