Java: enlace JSlider y JTextfield para valor flotante

abrazadera:

¿Cuál es la forma mejor y más fácil de vincular un JSlider y un JTextField de modo que si uno cambia, el otro también se actualiza, pero no hay un bucle recursivo?

¡Gracias!

Bart Kiers:

Aquí hay una demostración rápida y sucia:

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();
    }
}

EDITAR

Y si desea usar flotadores (como sugiere el título), puede extender la clase JSlider de esta manera:

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;
    }
}

El ejemplo anterior denota el intervalo entre 0 y 0,1 en 100 pasos.

Esto (nuevamente) es solo un ejemplo rápido y sucio, pero podría ayudarlo en su camino.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Valor oculto de JSlider para GTK + y Nimbus LookAndFeel en Linux

Enlace y enumeración para obtener valor del archivo resx

¿Cómo agregar ceros finales al valor de punto flotante y exportar para sobresalir como flotante (número)?

Java sobrecarga - largo y flotante

¿Cómo crear un valor doble a partir de una parte entera, flotante y exponente en Java?

Cómo imprimir valor flotante con dos decimales y sin decimal en java

¿Cómo definir el recurso para el tipo flotante y usarlo en el enlace de datos para `layout_constraintWidth_percent`?

Fondo flotante con valor de opacidad y botón flotante con valor diferente de opacidad

Código Java para hacer cumplir para tener número y carácter en Jtextfield

Escucha de cambio de valor para JTextField

Cómo corregir "El inicializador no proporciona ningún valor para este elemento de enlace y el elemento de enlace no tiene un valor predeterminado". en TypeScript?

Cómo convertir latitud y longitud a valor flotante en swift

Python Leer el valor de xml y convertirlo en flotante

Java 8 promedio de flujo para flotante

Enlace booleano JavaFX para un valor ContextMenuItem

Cómo analizar una cantidad de moneda (EE. UU. O UE) para valor flotante en Java

JSlider para dobles

¿Alternativa a ceil () y floor () para obtener los valores enteros más cercanos, por encima y por debajo de un valor de punto flotante?

Asistente de enlace de datos XML números de punto flotante y punto fijo

Mysql donde la comparación de cláusulas da un resultado diferente para el tipo de datos doble y flotante para el mismo valor

¿Cómo elegir el valor épsilon para punto flotante?

¿Usar el valor flotante de una letra para comparar?

Lanza void * a memcpy para obtener un valor flotante

AngularJS <enlace para componentes y directivas

Enlace para anclar y abrir acordeón

Groovy: compare un valor flotante en la lista y descubra valores que sean mayores que el valor flotante

Para un DataFrame con un índice flotante y columnas ordenadas, calcule un valor usando interpolación lineal, basado en los valores de un DataFrame

Creación de UDF de PySpark a partir del método de python con entrada de matriz numérica, para calcular y devolver un solo valor flotante

Creación de UDF de PySpark a partir del método de Python con entrada de matriz numérica, para calcular y devolver un solo valor flotante