有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing JSlider和JTextField的java设置勾选行为

这是我的GUI:

enter image description here

下面是一个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) 个答案

  1. # 1 楼答案

    It works, but the textfield will still show values between the 10s (Like 73) when dragging, and then adjust it when i let go of the slider. Is there a way to ONLY show tens, even when dragging?

    只需将当前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()));
                    }
    
                }
            });
    

    还有一个对Concurrency in Swing的读取,特别是对^{} (EDT),这要求我们通过^{}块在EDT上创建和操作所有Swing组件:

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            //create/manipulate UI, components etc here
        }
    });