Miglioramenti a JavaFX in Java SE 8u40

Indietro 1 2 3 4 Pagina 3 Avanti Pagina 3 di 4

Il Listato 5 utilizza la java.util.Pairclasse per memorizzare comodamente un paio di elementi: il testo di ricerca e il valore booleano di ricerca con distinzione tra maiuscole e minuscole. È stato installato un convertitore di risultati per convertire il campo di testo di ricerca della finestra di dialogo e i valori della casella di ricerca con distinzione tra maiuscole e minuscole in un Pairoggetto restituito dal call()metodo. Questa conversione avviene solo quando si Searchfa clic sul pulsante; non accade quando si Cancelfa clic.

Cerchi search.png?

Il listato 5 si basa su un search.pngfile immagine esterno , incluso nell'archivio del codice di questo articolo.

Compilare il listato 5 come segue:

javac SearchDialog.java

Eseguire l'applicazione risultante come segue:

java SearchDialog

La Figura 18 mostra la finestra di dialogo risultante.

Figura 18: per impostazione predefinita, la finestra di dialogo di ricerca non prevede alcun testo di ricerca e non fa distinzione tra maiuscole e minuscole

Supponiamo di inserire JavaFXnel campo di testo e di selezionare la casella di controllo. Dopo aver fatto clic Search, dovresti osservare il seguente output sul flusso di output standard:

Search text = JavaFX, Case-sensitive search = true

D: Potete fornirmi ulteriori informazioni sul supporto di JavaFX per le finestre di dialogo standard e personalizzate?

R: Dai un'occhiata alle finestre di dialogo JavaFX per ulteriori esempi di finestre di dialogo standard e personalizzate (inclusa una finestra di dialogo di accesso personalizzata) e per conoscere lo stile delle finestre di dialogo e l'impostazione del proprietario e della modalità delle finestre di dialogo.

Controllo dello spinner

D: Cos'è uno spinner?

R: Uno spinner è un controllo di campo di testo a riga singola che consente all'utente di selezionare un numero o un valore di oggetto da una sequenza ordinata di tali valori. Gli spinner in genere forniscono un paio di piccoli pulsanti freccia per scorrere gli elementi della sequenza. Anche i tasti up arrow/ della down arrowtastiera scorrono tra gli elementi. L'utente può anche essere autorizzato a digitare un valore (legale) direttamente nello spinner. Sebbene le caselle combinate forniscano funzionalità simili, a volte sono preferiti i filatori perché non richiedono un elenco a discesa che può oscurare dati importanti e anche perché consentono funzionalità come il ritorno a capo dal valore massimo al valore minimo (ad esempio, dal numero intero positivo più grande a 0).

D: Come viene implementato uno spinner?

R: Uno spinner è implementato come istanza della javafx.scene.control.Spinnerclasse di controllo. Questa classe si basa sulla javafx.scene.control.SpinnerValueFactoryclasse astratta per fornire il modello del controllo (intervallo di valori selezionabili dall'utente di un tipo specifico). Attualmente, i modelli supportati sono definiti dai suoi nidificati DoubleSpinnerValueFactory, IntegerSpinnerValueFactorye ListSpinnerValueFactoryle classi.

D: Come creo uno spinner?

A: Crei uno spinner chiamando uno dei Spinnercostruttori di. Ad esempio, Spinner(int min, int max, int initialValue)crea una casella di selezione per selezionare uno dei valori interi da mina max. Il valore inizialmente selezionato è identificato da initialValue. Se questo valore non è compreso nell'intervallo min/ max, minil valore di diventa il valore selezionato inizialmente.

Spinner(int min, int max, int initialValue)è un comodo costruttore che installa un'istanza della IntegerSpinnerValueFactoryclasse con questi valori come modello. Se preferisci lavorare direttamente con IntegerSpinnerValueFactory, puoi istanziare questa classe e passare il suo riferimento al Spinner(SpinnerValueFactory valueFactory)costruttore. In alternativa, puoi creare una casella di selezione vuota tramite il Spinner()costruttore e invocare Spinneril void setValueFactory(SpinnerValueFactory value)metodo di per installare questo oggetto factory.

D: Puoi fornire un semplice esempio degli spinner a virgola mobile a precisione doppia e intera?

A: Controlla il listato 6.

Listato 6. SpinnerDemo.java(versione 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(); } }

Il start()metodo del listato 6 crea prima uno spinner intero tramite il suddetto costruttore. Quindi crea uno spinner a virgola mobile a doppia precisione tramite il Spinner(double min, double max, double initialValue, double amountToStepBy)costruttore. Questo costruttore riceve le unità in cui aumentare o diminuire la casella di selezione tramite il valore passato a amountToStepBy, che sembra essere 0.5.

Continuando, start()crea e configura un contenitore del riquadro della griglia e popola la griglia 2 righe per 2 colonne con questi filatori e le etichette associate. Quindi crea la scena in base alla griglia e configura / mostra il palco.

Compila il listato 6 come segue:

javac SpinnerDemo.java

Eseguire l'applicazione risultante come segue:

java SpinnerDemo

La Figura 19 mostra l'interfaccia utente risultante.

Figura 19: fare clic sulle frecce di ciascuna casella di selezione per aumentare / diminuire l'intervallo di valori

D: Voglio rendere modificabili i precedenti filatori. Come eseguo questa operazione?

A: Chiamata Spinner's void setEditable(boolean value)metodo, passando truea value. Ho creato una seconda versione di SpinnerDemoper dimostrare. Vedi l'archivio del codice di questo articolo per il codice sorgente.

D: Quando rendo modificabili gli spinner precedenti, digito caratteri illegali (come lettere) nel campo di testo e premo il Entertasto, viene generata un'eccezione. L'eccezione è java.lang.NumberFormatExceptionper lo spinner basato su numeri interi e java.lang.RuntimeException(wrapping java.text.ParseException) per lo spinner a virgola mobile a doppia precisione. Come posso evitare che questa eccezione venga generata?

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?