Подобрения на JavaFX в Java SE 8u40

Предишна 1 2 3 4 Страница 3 Следваща Страница 3 от 4

Листинг 5 използва java.util.Pairкласа за удобно съхранение на двойка елементи: текстът за търсене и логическата стойност на булево-чувствително търсене. Инсталиран е преобразувател на резултати, за да преобразува текстовото поле за търсене на диалоговия прозорец и стойностите на квадратчетата за търсене, чувствителни към регистъра, в Pairобект, който се връща от call()метода. Това преобразуване се случва само при Searchщракване върху бутона; не се случва, когато Cancelсе щракне.

Търсите search.png?

Листинг 5 разчита на външен search.pngфайл с изображение, който е включен в архива на кодове на тази статия.

Съставете списък 5, както следва:

javac SearchDialog.java

Стартирайте полученото приложение, както следва:

java SearchDialog

Фигура 18 разкрива получения диалог.

Фигура 18: По подразбиране диалоговият прозорец за търсене не съдържа текст за търсене и търсене без регистра

Да предположим, че въвеждате JavaFXв текстовото поле и поставяте отметка в квадратчето. След като щракнете Search, трябва да наблюдавате следния изход на стандартния изходен поток:

Search text = JavaFX, Case-sensitive search = true

В: Можете ли да ми предоставите повече информация за поддръжката на JavaFX за стандартни и персонализирани диалогови прозорци?

О: Разгледайте диалоговите прозорци JavaFX за допълнителни стандартни и персонализирани примери за диалогов прозорец (включително персонализиран диалогов прозорец за влизане) и за да научите за стила и настройката на диалоговия прозорец и модалността.

Контрол на въртене

В: Какво представлява спинърът?

A: А фабрика е едноредов текст контрол поле, което позволява на потребителя да изберете номер или стойност на обект от подредено поредица от такива стойности. Спинерите обикновено предоставят чифт малки бутони със стрелки за преминаване през елементите на последователността. Клавиатурата up arrow/ down arrowклавишите също преминават през елементите. На потребителя може също да бъде позволено да въведе (правна) стойност директно в центрофугата. Въпреки че комбинираните полета осигуряват подобна функционалност, спинърите понякога са предпочитани, тъй като не изискват падащ списък, който може да закрива важни данни, а също и защото позволяват функции като опаковане от максималната стойност обратно към минималната стойност (напр. от най-голямото положително цяло число до 0).

Въпрос: Как се прилага спинър?

О: Въртящо устройство е внедрено като екземпляр на javafx.scene.control.Spinnerконтролния клас. Този клас разчита на абстрактния javafx.scene.control.SpinnerValueFactoryклас, за да предостави модела на контролата (диапазон от избираеми от потребителя стойности от определен тип). В момента само поддържани модели се определят от неговите вложени DoubleSpinnerValueFactory, IntegerSpinnerValueFactoryи ListSpinnerValueFactoryкласове.

Въпрос: Как да създам спинер?

О: Създавате спинър, като извикате един от Spinnerконструкторите на. Например, Spinner(int min, int max, int initialValue)създава въртящ механизъм за избор на една от целочислените стойности от minпрез max. Първоначално избраната стойност се идентифицира с initialValue. Ако тази стойност не е в min/ maxдиапазона, minстойността на 'става първоначално избраната стойност.

Spinner(int min, int max, int initialValue)е конструктор за удобство, който инсталира екземпляр на IntegerSpinnerValueFactoryкласа с тези стойности като модел. Ако предпочитате да работите директно с него IntegerSpinnerValueFactory, можете да създадете екземпляр на този клас и да предадете препратката му към Spinner(SpinnerValueFactory valueFactory)конструктора. Като алтернатива можете да създадете празен фабрика чрез Spinner()конструктора и извикайте Spinnerе void setValueFactory(SpinnerValueFactory value)метод за инсталиране на този завод обект.

В: Можете ли да предоставите прост пример за целочислени и двойно прецизни въртящи се устройства с плаваща запетая?

О: Вижте списък 6.

Листинг 6. SpinnerDemo.java(версия 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(); } }

start()Методът на Списък 6 първо създава цяло число за завъртане чрез гореспоменатия конструктор. След това създава двойно прецизен въртящ механизъм с плаваща запетая чрез Spinner(double min, double max, double initialValue, double amountToStepBy)конструктора. Този конструктор получава мерните единици, в които да се увеличи или намали въртящият механизъм чрез предадената стойност amountToStepBy, която се случва 0.5.

Продължавайки, start()създава и конфигурира контейнер на панел на мрежата и попълва мрежата от 2 реда по 2 колони с тези въртящи се устройства и свързани етикети. След това създава сцената въз основа на мрежата и конфигурира / показва сцената.

Съставете списък 6, както следва:

javac SpinnerDemo.java

Стартирайте полученото приложение, както следва:

java SpinnerDemo

Фигура 19 разкрива получения потребителски интерфейс.

Фигура 19: Щракнете върху стрелките на всеки въртящ механизъм, за да увеличите / намалите през диапазона от стойности

Въпрос: Искам да направя предишните спинери за редактиране. Как да изпълня тази задача?

A: Call Spinnerе void setEditable(boolean value)метод, който минава trueза value. Създадох втора версия на SpinnerDemoза демонстрация. Вижте архива на тази статия за изходния код.

Въпрос: Когато направя предходните спинери за редактиране, въвеждам незаконни символи (като букви) в текстовото поле и натискам Enterклавиша, се появява изключение. Изключението е java.lang.NumberFormatExceptionза целочислено въртящо се устройство и java.lang.RuntimeException(обвиване java.text.ParseException) за двойно прецизно въртящо се устройство с плаваща запетая. Как мога да предотвратя изхвърлянето на това изключение?

О: Можете да предотвратите изхвърлянето на това изключение, като инсталирате екземпляр на подклас на абстрактния javafx.util.StringConverterклас (където Tе типът, който се преобразува в или от String) като SpinnerValueFactoryконвертор. Този обект ще улови изхвърленото изключение и ще предприеме действия.

Spinnerизползва javafx.scene.control.TextFieldобект като редактор за получаване на потребителски вход. Тъй като текстовото поле може да съхранява всеки символ, могат да се въвеждат неподходящи символи като букви в цифров контекст. След като потребителят натисне Enter, входът се предава SpinnerValueFactoryна T fromString(String string)метода на преобразувателя . За фабриките с плаваща запетая с цяло число или двойна точност Tе Integerили Double. Преобразуването от низ с незаконни символи в число води до изключение, от което се изхвърля fromString(). Получете препратка към текущия преобразувател и инсталирайте нов преобразувател, чийто fromString()метод извиква метода на другия преобразувател fromString()в tryизраз с подходящ catchблок. Листинг 7 представя приложение, което изпълнява тази задача.

Листинг 7. SpinnerDemo.java(версия 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(); } }

Компилирайте списък 7 ( javac SpinnerDemo.java) и стартирайте полученото приложение ( java SpinnerDemo). Трябва да наблюдавате съобщения за грешки, подобни на показаните по-долу, когато въвеждате незаконни символи в текстовото поле на въртящия се механизъм:

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

Въпрос: Имам нужда от спинър на базата на струни. Как да получа такъв?

О: Можете да получите спинър на базата на струни чрез Spinner(ObservableList items)конструктора. Например, следният фрагмент от код ви показва как да създадете въртящ механизъм за избор на име на делничен ден:

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

Извадих този фрагмент от четвърта версия на SpinnerDemoприложението (вижте архива на кода на тази статия за изходния код). Когато стартирате това приложение, ще видите въртящото устройство, показано на фигура 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?