JavaFX-Verbesserungen in Java SE 8u40

Zurück 1 2 3 4 Page 3 Weiter Seite 3 von 4

Listing 5 verwendet die java.util.PairKlasse, um bequem ein Paar von Elementen zu speichern: den Suchtext und den Booleschen Suchwert für Groß- und Kleinschreibung. Ein Ergebniskonverter wurde installiert, um das Suchtextfeld und die Kontrollkästchenwerte des Dialogfelds in ein PairObjekt zu konvertieren, das von der call()Methode zurückgegeben wird. Diese Konvertierung erfolgt nur, wenn auf die SearchSchaltfläche geklickt wird. es passiert nicht, wenn Cancelgeklickt wird.

Auf der Suche nach search.png?

Listing 5 basiert auf einer externen search.pngBilddatei, die im Codearchiv dieses Artikels enthalten ist.

Kompilieren Sie Listing 5 wie folgt:

javac SearchDialog.java

Führen Sie die resultierende Anwendung wie folgt aus:

java SearchDialog

Abbildung 18 zeigt den resultierenden Dialog.

Abbildung 18: Der Suchdialog enthält standardmäßig keinen Suchtext und eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung

Angenommen, Sie geben JavaFXin das Textfeld ein und aktivieren das Kontrollkästchen. Nach dem Klicken Searchsollten Sie die folgende Ausgabe im Standardausgabestream beobachten:

Search text = JavaFX, Case-sensitive search = true

F: Können Sie mir weitere Informationen zur Unterstützung von JavaFX für Standard- und benutzerdefinierte Dialoge geben?

A: In JavaFX-Dialogen finden Sie zusätzliche Standard- und benutzerdefinierte Dialogbeispiele (einschließlich eines benutzerdefinierten Anmeldedialogs) sowie Informationen zum Dialogstil und zum Festlegen des Dialogbesitzers und der Modalität.

Spinner-Kontrolle

F: Was ist ein Spinner?

A: Ein Drehfeld ist ein einzeiliges Textfeldsteuerelement, mit dem der Benutzer eine Zahl oder einen Objektwert aus einer geordneten Folge solcher Werte auswählen kann. Spinner bieten normalerweise ein Paar winziger Pfeiltasten zum Durchlaufen der Elemente der Sequenz. Die Tastaturen up arrow/ down arrowTasten durchlaufen auch die Elemente. Dem Benutzer kann auch gestattet werden, einen (legalen) Wert direkt in den Spinner einzugeben. Obwohl Kombinationsfelder ähnliche Funktionen bieten, werden Spinner manchmal bevorzugt, weil sie keine Dropdown-Liste benötigen, die wichtige Daten verdecken kann, und weil sie Funktionen wie das Umbrechen vom Maximalwert zurück zum Minimalwert ermöglichen (z. von der größten positiven ganzen Zahl bis 0).

F: Wie wird ein Spinner implementiert?

A: Ein Spinner ist als Instanz der javafx.scene.control.SpinnerKontrollklasse implementiert . Diese Klasse stützt sich auf die abstrakte javafx.scene.control.SpinnerValueFactoryKlasse, um das Modell des Steuerelements bereitzustellen (Bereich von vom Benutzer auswählbaren Werten eines bestimmten Typs). Derzeit sind die einzigen unterstützten Modelle durch seine verschachtelten definiert DoubleSpinnerValueFactory, IntegerSpinnerValueFactoryund ListSpinnerValueFactoryKlassen.

F: Wie erstelle ich einen Spinner?

A: Sie erstellen einen Spinner, indem Sie einen der SpinnerKonstruktoren aufrufen . Erstellt beispielsweise Spinner(int min, int max, int initialValue)einen Drehfeld zum Auswählen eines der ganzzahligen Werte von minbis max. Der ursprünglich ausgewählte Wert wird durch identifiziert initialValue. Wenn dieser Wert nicht im Bereich min/ maxliegt, minwird der Wert zum ursprünglich ausgewählten Wert.

Spinner(int min, int max, int initialValue)ist ein Convenience-Konstruktor, der eine Instanz der IntegerSpinnerValueFactoryKlasse mit diesen Werten als Modell installiert . Wenn Sie lieber direkt mit arbeiten möchten IntegerSpinnerValueFactory, können Sie diese Klasse instanziieren und ihre Referenz an den Spinner(SpinnerValueFactory valueFactory)Konstruktor übergeben. Alternativ können Sie über den Spinner()Konstruktor einen leeren Spinner erstellen und die Methode aufrufen Spinner, void setValueFactory(SpinnerValueFactory value)um dieses Factory-Objekt zu installieren.

F: Können Sie ein einfaches Beispiel für Gleitkomma-Spinner mit Ganzzahl und doppelter Genauigkeit geben?

A: Schauen Sie sich Listing 6 an.

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

Die start()Methode von Listing 6 erstellt zunächst einen ganzzahligen Spinner über den oben genannten Konstruktor. Anschließend wird über den Spinner(double min, double max, double initialValue, double amountToStepBy)Konstruktor ein Gleitkomma-Spinner mit doppelter Genauigkeit erstellt . Dieser Konstruktor empfängt die Einheiten, in denen der Spinner inkrementiert oder dekrementiert werden soll, über den an übergebenen Wert amountToStepBy, der zufällig ist 0.5.

Wenn Sie fortfahren, start()erstellen und konfigurieren Sie einen Rasterbereichscontainer und füllen Sie das 2-Zeilen-2-Spalten-Raster mit diesen Spinnern und den zugehörigen Beschriftungen. Anschließend wird die Szene basierend auf dem Raster erstellt und die Bühne konfiguriert / angezeigt.

Kompilieren Sie Listing 6 wie folgt:

javac SpinnerDemo.java

Führen Sie die resultierende Anwendung wie folgt aus:

java SpinnerDemo

Abbildung 19 zeigt die resultierende Benutzeroberfläche.

Abbildung 19: Klicken Sie auf die Pfeile der einzelnen Drehfelder, um den Wertebereich zu erhöhen / zu verringern

F: Ich möchte die vorherigen Spinner bearbeitbar machen. Wie erfülle ich diese Aufgabe?

A: Rufen Sie Spinnerdie void setEditable(boolean value)Methode des Aufrufs trueauf value. Ich habe eine zweite Version von erstellt SpinnerDemo, um zu demonstrieren. Den Quellcode finden Sie im Codearchiv dieses Artikels.

F: Wenn ich die vorherigen Spinner bearbeitbar mache, unzulässige Zeichen (z. B. Buchstaben) in das Textfeld eingebe und die EnterTaste drücke , wird eine Ausnahme ausgelöst. Die Ausnahme ist java.lang.NumberFormatExceptionfür den ganzzahligen Spinner und java.lang.RuntimeException(Wrapping java.text.ParseException) für den Gleitkomma-Spinner mit doppelter Genauigkeit. Wie kann ich verhindern, dass diese Ausnahme ausgelöst wird?

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?