当前位置: 首页 > 面试题库 >

Java:将JSlider和JTextfield链接为浮点值

杨昊
2023-03-14
问题内容

链接JSlider和JTextField的最佳和最简便的方法是什么,以便如果其中一个发生更改,另一个也将被更新,但是没有递归循环?

谢谢!


问题答案:

这是一个快速而肮脏的演示:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Main {
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        final JTextField text = new JTextField(20);
        final JSlider slider = new JSlider(0, 100, 0);
        slider.addChangeListener(new ChangeListener(){
            @Override
            public void stateChanged(ChangeEvent e) {
                text.setText(String.valueOf(slider.getValue()));
            }
        });
        text.addKeyListener(new KeyAdapter(){
            @Override
            public void keyReleased(KeyEvent ke) {
                String typed = text.getText();
                slider.setValue(0);
                if(!typed.matches("\\d+") || typed.length() > 3) {
                    return;
                }
                int value = Integer.parseInt(typed);
                slider.setValue(value);
            }
        });
        frame.setLayout(new BorderLayout());
        frame.add(text, BorderLayout.NORTH);
        frame.add(slider, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();
    }
}

编辑

如果要使用浮点数(如标题所示),则可以像下面这样扩展JSlider类:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.text.DecimalFormat;

public class Main {
    public static void main(String[] args) {
        final DecimalFormat df = new DecimalFormat("0.####");
        final JFrame frame = new JFrame();
        final JTextField text = new JTextField(20);
        final DoubleJSlider slider = new DoubleJSlider(0, 100, 0, 1000);
        slider.addChangeListener(new ChangeListener(){
            @Override
            public void stateChanged(ChangeEvent e) {
                text.setText(df.format(slider.getScaledValue()));
            }
        });
        text.addKeyListener(new KeyAdapter(){
            @Override
            public void keyReleased(KeyEvent ke) {
                String typed = text.getText();
                slider.setValue(0);
                if(!typed.matches("\\d+(\\.\\d*)?")) {
                    return;
                }
                double value = Double.parseDouble(typed)*slider.scale;
                slider.setValue((int)value);
            }
        });
        frame.setLayout(new BorderLayout());
        frame.add(text, BorderLayout.NORTH);
        frame.add(slider, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();
    }
}

class DoubleJSlider extends JSlider {

    final int scale;

    public DoubleJSlider(int min, int max, int value, int scale) {
        super(min, max, value);
        this.scale = scale;
    }

    public double getScaledValue() {
        return ((double)super.getValue()) / this.scale;
    }
}

上面的示例表示100步在0到0.1之间的间隔。

(再次)这只是一个快速而肮脏的示例,但可能会对您有所帮助。



 类似资料:
  • 我有一个包含文本字段(红色、绿色、蓝色)和滑块(红色、绿色、蓝色)的面板。用户应该能够使用他们喜欢的任何组件,相应的组件应该更新。(例如,在红色文本字段中输入100应将红色滑块移动到100)。

  • 主要内容:1 Java JSlider的介绍,2 Java JSlider的构造方法,3 Java JSlider的方法,4 Java JSlider的案例1,5 Java JSlider的案例21 Java JSlider的介绍 Java JSlider类用于创建滑块。通过使用JSlider,用户可以从特定范围中选择一个值。 2 Java JSlider的构造方法 方法 描述 JSlider() 创建一个滑块,其初始值为50,范围为0到100。 JSlider(int orientation)

  • 我希望我的文本字段只接受数字(数字)和一个点,因为这是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除。 有人能帮我修一下吗?

  • 问题内容: 首先,我尝试了这篇文章(以及其他内容):Python中的货币格式。它对我的变量没有影响。我最好的猜测是,因为我使用的是Python 3,而那是Python 2的代码。(除非我忽略了某些东西,因为我是Python的新手)。 我想将浮点数(例如1234.5)转换为字符串,例如“ $ 1,234.50”。 我将如何去做呢? 以防万一,这是我的已编译但不影响我的变量的代码: 同样不成功: 问题

  • 我试图理解java重载规则。除了遵循之外,一切似乎都很好, 为什么调用解析为foo(浮动)。我从JLS了解到以下内容, 此步骤使用方法的名称和参数表达式的类型来定位可访问和适用的方法。可能有多个这样的方法,在这种情况下,选择最具体的方法。 我有意在这里使用Wrapper Long,而不是primitive Long。大小为64位的原语long不会以结束,而是以32位float结束。 问题是为什么J

  • 我有一个csv文件包含一些浮点数据。代码很简单 然后我将其转换为float32以节省内存使用。 值刚刚更改!我如何保持数据不变? (我也尝试了,但是print仍然得到相同的输出)