2

这是我的图形用户界面:

在此处输入图像描述

下面是一个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);
    }
}
4

1 回答 1

4

它可以工作,但文本字段在拖动时仍会显示 10 秒(如 73)之间的值,然后在我放开滑块时调整它。有没有办法只显示十位,即使在拖动时也是如此?

只需将当前值四舍五入JSlider到最接近的 10,然后将其设置JTextField为该数字:

 js.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {

                if(js.getValueIsAdjusting()) {//slider value is still being adjusted
                    int num=(int)(Math.rint((double) js.getValue() / 10) * 10);//round to nearest 10
                    tf.setText(String.valueOf(num));//set textfield with value of nearest 10                  
                } else {//slider value has been set/no adjustments happenening
                    tf.setText(String.valueOf(js.getValue()));
                }

            }
        });

还可以阅读Swing 中的 Concurrency,特别是Event Dispatch thread(EDT),它要求我们通过SwingUtilities.invokeXXX块创建和操作 EDT 上的所有 Swing 组件:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        //create/manipulate UI, components etc here
    }
});
于 2013-07-10T09:20:27.297 回答