Mejoras de JavaFX en Java SE 8u40

Anterior 1 2 3 4 Página 3 Siguiente Página 3 de 4

El Listado 5 usa la java.util.Pairclase para almacenar convenientemente un par de elementos: el texto de búsqueda y el valor de búsqueda booleano sensible a mayúsculas y minúsculas. Se ha instalado un convertidor de resultados para convertir el campo de texto de búsqueda del cuadro de diálogo y los valores de la casilla de verificación de búsqueda que distingue entre mayúsculas y minúsculas en un Pairobjeto devuelto por el call()método. Esta conversión ocurre solo cuando Searchse hace clic en el botón; no sucede cuando Cancelse hace clic.

Buscando search.png?

El Listado 5 se basa en un search.pngarchivo de imagen externo , que se incluye en el archivo de código de este artículo.

Compile el Listado 5 de la siguiente manera:

javac SearchDialog.java

Ejecute la aplicación resultante de la siguiente manera:

java SearchDialog

La Figura 18 revela el diálogo resultante.

Figura 18: El cuadro de diálogo de búsqueda no muestra texto de búsqueda y una búsqueda que no distingue entre mayúsculas y minúsculas

Suponga que ingresa JavaFXen el campo de texto y marca la casilla de verificación. Después de hacer clic Search, debe observar la siguiente salida en el flujo de salida estándar:

Search text = JavaFX, Case-sensitive search = true

P: ¿Puede proporcionarme más información sobre el soporte de JavaFX para cuadros de diálogo estándar y personalizados?

R: Consulte los cuadros de diálogo JavaFX para ver ejemplos de cuadros de diálogo estándar y personalizados adicionales (incluido un cuadro de diálogo de inicio de sesión personalizado), y para aprender sobre el estilo del cuadro de diálogo y la configuración del propietario y la modalidad del cuadro de diálogo.

Control giratorio

P: ¿Qué es una ruleta?

R: Una ruleta es un control de campo de texto de una sola línea que permite al usuario seleccionar un número o un valor de objeto de una secuencia ordenada de dichos valores. Los giradores suelen proporcionar un par de pequeños botones de flecha para recorrer los elementos de la secuencia. Las teclas up arrow/ del down arrowteclado también recorren los elementos. Al usuario también se le puede permitir escribir un valor (legal) directamente en la ruleta. Aunque los cuadros combinados brindan una funcionalidad similar, a veces se prefieren los indicadores giratorios porque no requieren una lista desplegable que pueda ocultar datos importantes, y también porque permiten características como ajustar desde el valor máximo hasta el valor mínimo (por ejemplo, del entero positivo más grande a 0).

P: ¿Cómo se implementa una ruleta?

R: Una ruleta se implementa como una instancia de la javafx.scene.control.Spinnerclase de control. Esta clase se basa en la javafx.scene.control.SpinnerValueFactoryclase abstracta para proporcionar el modelo de control (rango de valores seleccionables por el usuario de un tipo específico). Actualmente, los modelos soportados son definidos por sus anidadas DoubleSpinnerValueFactory, IntegerSpinnerValueFactoryy ListSpinnerValueFactoryclases.

P: ¿Cómo creo una ruleta?

R: Creas una ruleta llamando a uno de Spinnerlos constructores. Por ejemplo, Spinner(int min, int max, int initialValue)crea una ruleta para seleccionar uno de los valores enteros desde minhasta max. El valor seleccionado inicialmente se identifica mediante initialValue. Si este valor no está en el rango min/ max, minel valor de 'se convierte en el valor seleccionado inicialmente.

Spinner(int min, int max, int initialValue)es un constructor de conveniencia que instala una instancia de la IntegerSpinnerValueFactoryclase con estos valores como modelo. Si prefiere trabajar directamente con IntegerSpinnerValueFactory, puede crear una instancia de esta clase y pasar su referencia al Spinner(SpinnerValueFactory valueFactory)constructor. Alternativamente, puede crear una ruleta vacía a través del Spinner()constructor e invocar Spinnerel void setValueFactory(SpinnerValueFactory value)método para instalar este objeto de fábrica.

P: ¿Puede proporcionar un ejemplo simple de los hiladores de punto flotante de precisión entera y doble?

R: Consulte el Listado 6.

Listado 6. SpinnerDemo.java(versión 1)

import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.GridPane; import javafx.stage.Stage; public class SpinnerDemo extends Application { @Override public void start(Stage primaryStage) { Spinner ispinner = new Spinner(1, 10, 2); Spinner dspinner = new Spinner(1.5, 3.5, 1.5, 0.5); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(10)); grid.add(new Label("Integer Spinner"), 0, 0); grid.add(ispinner, 1, 0); grid.add(new Label("Double Spinner"), 0, 1); grid.add(dspinner, 1, 1); Scene scene = new Scene(grid, 350, 100); primaryStage.setTitle("SpinnerDemo"); primaryStage.setScene(scene); primaryStage.show(); } }

El start()método del Listado 6 primero crea una ruleta entera a través del constructor mencionado anteriormente. Luego crea una ruleta de punto flotante de doble precisión a través del Spinner(double min, double max, double initialValue, double amountToStepBy)constructor. Este constructor recibe las unidades en las que aumentar o disminuir la ruleta a través del valor pasado a amountToStepBy, que resulta ser 0.5.

Continuando, start()crea y configura un contenedor de panel de cuadrícula y llena la cuadrícula de 2 filas por 2 columnas con estos indicadores y etiquetas asociadas. Luego crea la escena basada en la cuadrícula y configura / muestra el escenario.

Compile el Listado 6 de la siguiente manera:

javac SpinnerDemo.java

Ejecute la aplicación resultante de la siguiente manera:

java SpinnerDemo

La Figura 19 revela la interfaz de usuario resultante.

Figura 19: Haga clic en las flechas de cada control giratorio para incrementar / disminuir a través del rango de valores

P: Quiero que los elementos giratorios anteriores sean editables. ¿Cómo realizo esta tarea?

R: Call Spinner's void setEditable(boolean value)método, pasando truea value. He creado una segunda versión de SpinnerDemopara demostrar. Consulte el archivo de código de este artículo para obtener el código fuente.

P: Cuando hago editables las flechas giratorias anteriores, escribo caracteres ilegales (como letras) en el campo de texto y presiono la Entertecla, se lanza una excepción. La excepción es java.lang.NumberFormatExceptionpara la ruleta basada en números enteros y java.lang.RuntimeException(envoltura java.text.ParseException) para la ruleta de punto flotante de doble precisión. ¿Cómo puedo evitar que se lance esta excepción?

A: You can prevent this exception from being thrown by installing an instance of a subclass of the abstract javafx.util.StringConverter class (where T is the type being converted to or from String) as the SpinnerValueFactory converter. This object would catch the exception being thrown and take action.

Spinner uses a javafx.scene.control.TextField object as an editor for obtaining user input. Because a text field can store any character, inappropriate characters such as letters in a numeric context can be entered. After the user presses Enter, the input is passed to the SpinnerValueFactory converter's T fromString(String string) method. For the integer or double precision floating-point factories, T is either Integer or Double. Converting from a string with illegal characters to a number results in the exception being thrown from fromString(). Obtain a reference to the current converter and install a new converter whose fromString() method invokes the other converter's fromString() method in a try statement with an appropriate catch block. Listing 7 presents an application that accomplishes this task.

Listing 7. SpinnerDemo.java (version 3)

import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import javafx.util.StringConverter; public class SpinnerDemo extends Application { @Override public void start(Stage primaryStage) { Spinner ispinner = new Spinner(1, 10, 2); ispinner.setEditable(true); StringConverter sci = ispinner.getValueFactory().getConverter(); StringConverter sci2 = new StringConverter() { @Override public Integer fromString(String value) { try { return sci.fromString(value); } catch (NumberFormatException nfe) { System.out.println("Bad integer: " + value); return 0; } } @Override public String toString(Integer value) { return sci.toString(value); } }; ispinner.getValueFactory().setConverter(sci2); Spinner dspinner = new Spinner(1.5, 3.5, 1.5, 0.5); dspinner.setEditable(true); StringConverter scd = dspinner.getValueFactory().getConverter(); StringConverter scd2 = new StringConverter() { @Override public Double fromString(String value) { try { return scd.fromString(value); } catch (RuntimeException re) { System.out.println("Bad double: " + value); System.out.println("Cause: " + re.getCause()); return 0.0; } } @Override public String toString(Double value) { return scd.toString(value); } }; dspinner.getValueFactory().setConverter(scd2); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(10)); grid.add(new Label("Integer Spinner"), 0, 0); grid.add(ispinner, 1, 0); grid.add(new Label("Double Spinner"), 0, 1); grid.add(dspinner, 1, 1); Scene scene = new Scene(grid, 350, 100); primaryStage.setTitle("SpinnerDemo"); primaryStage.setScene(scene); primaryStage.show(); } }

Compile Listing 7 (javac SpinnerDemo.java) and run the resulting application (java SpinnerDemo). You should observe error messages similar to those shown below when you enter illegal characters into a spinner's text field:

Bad integer: a2 Bad double: b1.5 Cause: java.text.ParseException: Unparseable number: "b1.5"

Q: I need a string-based spinner. How do I obtain one?

A: You can obtain a string-based spinner via the Spinner(ObservableList items) constructor. For example, the following code fragment shows you how to create a spinner for selecting a weekday name:

List weekDays = Arrays.asList("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"); ObservableList obsWeekDays = FXCollections.observableList(weekDays); Spinner sspinner = new Spinner(obsWeekDays);

I excerpted this code fragment from a fourth version of the SpinnerDemo application (see this article's code archive for the source code). When you run that application, you'll see the spinner shown in Figure 20.

Figure 20: Attempting to enter text into the editor that doesn't exactly match one of the weekday names results in java.lang.UnsupportedOperationException being thrown

Q: Can you provide me with more information about JavaFX's support for spinners?

A: Check out the JavaFX 8 documentation on Spinner and SpinnerValueFactory for more information about this control and its model. Also, you might want to run a Google search to find out how others are using this control.

Text formatting

Q: How does JavaFX support text formatting?

A: JavaFX supports text formatting by providing the javafx.scene.control.TextFormatter class with its nested Change class. Furthermore, the abstract javafx.scene.control.TextInputControl class (the parent class of TextField and javafx.scene.control.TextArea) has been given a textFormatter property so that any subclass automatically supports text formatting.

Q: What kinds of text formatting are supported?

A:TextFormatter supports two kinds of text formatting: value and change. A value formatter is called when you press the Enter key after entering the text. A change formatter is called for every text-deletion, text-addition, and text-replacement change for the focused text-input control. These formatters can be used separately or together.

Q: How are value and change formatters specified?