Peningkatan JavaFX di Java SE 8u40

Sebelumnya 1 2 3 4 Halaman 3 Berikutnya Halaman 3 dari 4

Kode 5 menggunakan java.util.Pairkelas untuk dengan mudah menyimpan sepasang item: teks pencarian dan nilai pencarian case-sensitive Boolean. Pengonversi hasil telah diinstal untuk mengonversi bidang teks pencarian dialog dan nilai kotak centang pencarian peka huruf besar / kecil menjadi Pairobjek yang dikembalikan dari call()metode. Konversi ini hanya terjadi jika Searchtombol diklik; itu tidak terjadi saat Canceldiklik.

Mencari search.png?

Kode 5 bergantung pada search.pngfile gambar eksternal , yang termasuk dalam arsip kode artikel ini.

Susun Daftar 5 sebagai berikut:

javac SearchDialog.java

Jalankan aplikasi yang dihasilkan sebagai berikut:

java SearchDialog

Gambar 18 menunjukkan dialog yang dihasilkan.

Gambar 18: Default dialog pencarian tidak ada teks pencarian dan pencarian case-insensitive

Misalkan Anda memasukkan JavaFXdi kolom teks dan mencentang kotak. Setelah mengklik Search, Anda harus mengamati keluaran berikut pada aliran keluaran standar:

Search text = JavaFX, Case-sensitive search = true

T: Dapatkah Anda memberi saya informasi lebih lanjut tentang dukungan JavaFX untuk dialog standar dan kustom?

J: Lihat Dialog JavaFX untuk contoh dialog standar dan kustom tambahan (termasuk dialog login kustom), dan untuk mempelajari tentang gaya dialog dan menyetel pemilik dan modalitas dialog.

Kontrol pemintal

T: Apa itu spinner?

A: Sebuah pemintal adalah single-line text kontrol lapangan yang memungkinkan pengguna memilih nomor atau nilai objek dari memerintahkan urutan nilai-nilai tersebut. Pemintal biasanya menyediakan sepasang tombol panah kecil untuk melangkah melalui elemen urutan. Keyboard up arrow/ down arrowtombol juga menggilir elemen. Pengguna juga dapat diizinkan untuk mengetikkan nilai (legal) langsung ke spinner. Meskipun kotak kombo menyediakan fungsionalitas yang serupa, spinner terkadang lebih disukai karena tidak memerlukan daftar drop-down yang dapat mengaburkan data penting, dan juga karena memungkinkan fitur seperti menggabungkan dari nilai maksimum kembali ke nilai minimum (misalnya, dari bilangan bulat positif terbesar ke 0).

T: Bagaimana cara pemintal diterapkan?

J: Spinner diimplementasikan sebagai turunan dari javafx.scene.control.Spinnerkelas kontrol. Kelas ini bergantung pada javafx.scene.control.SpinnerValueFactorykelas abstrak untuk menyediakan model kontrol (kisaran nilai yang dapat dipilih pengguna dari tipe tertentu). Saat ini, model hanya didukung didefinisikan oleh bersarang nya DoubleSpinnerValueFactory, IntegerSpinnerValueFactorydan ListSpinnerValueFactorykelas.

T: Bagaimana cara membuat spinner?

J: Anda membuat spinner dengan memanggil salah satu Spinnerkonstruktor. Misalnya, Spinner(int min, int max, int initialValue)membuat spinner untuk memilih salah satu nilai integer dari minsampai max. Nilai awal yang dipilih diidentifikasi oleh initialValue. Jika nilai ini tidak ada di min/ maxrange, minnilai menjadi nilai awal yang dipilih.

Spinner(int min, int max, int initialValue)adalah konstruktor praktis yang menginstal instance IntegerSpinnerValueFactorykelas dengan nilai-nilai ini sebagai model. Jika Anda lebih suka bekerja dengan secara langsung IntegerSpinnerValueFactory, Anda dapat membuat instance kelas ini dan meneruskan referensinya ke Spinner(SpinnerValueFactory valueFactory)konstruktor. Atau, Anda dapat membuat spinner kosong melalui Spinner()konstruktor dan meminta Spinner's void setValueFactory(SpinnerValueFactory value)metode untuk menginstal objek pabrik ini.

T: Dapatkah Anda memberikan contoh sederhana dari pemintal floating-point presisi bilangan bulat dan ganda?

A: Lihat Daftar 6.

Kode 6. SpinnerDemo.java(versi 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()Metode Listing 6 pertama kali membuat pemintal integer melalui konstruktor yang disebutkan di atas. Ini kemudian menciptakan pemintal floating-point presisi ganda melalui Spinner(double min, double max, double initialValue, double amountToStepBy)konstruktor. Konstruktor ini menerima unit untuk menaikkan atau menurunkan spinner melalui nilai yang diteruskan ke amountToStepBy, yang kebetulan 0.5.

Melanjutkan, start()membuat dan mengonfigurasi wadah panel kisi dan mengisi kisi 2-baris-oleh-2-kolom dengan pemintal ini dan label terkait. Itu kemudian membuat adegan berdasarkan grid dan mengkonfigurasi / menunjukkan panggung.

Kompilasi Listing 6 sebagai berikut:

javac SpinnerDemo.java

Jalankan aplikasi yang dihasilkan sebagai berikut:

java SpinnerDemo

Gambar 19 menunjukkan antarmuka pengguna yang dihasilkan.

Gambar 19: Klik setiap panah pemintal untuk menaikkan / menurunkan melalui rentang nilai

T: Saya ingin membuat pemintal sebelumnya dapat diedit. Bagaimana cara menyelesaikan tugas ini?

A: Panggilan Spinner's void setEditable(boolean value)metode, melewati trueke value. Saya telah membuat versi kedua SpinnerDemountuk menunjukkan. Lihat arsip kode artikel ini untuk kode sumber.

T: Saat saya membuat pemintal sebelumnya dapat diedit, ketik karakter ilegal (seperti huruf) ke dalam bidang teks, dan tekan Entertombol, pengecualian dilempar. Pengecualiannya adalah java.lang.NumberFormatExceptionuntuk spinner berbasis integer dan java.lang.RuntimeException(pembungkus java.text.ParseException) untuk spinner floating-point presisi ganda. Bagaimana saya bisa mencegah pengecualian ini dilempar?

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?