Menjelajahi kelas Aplikasi JavaFX

Aplikasi JavaFX didasarkan pada Applicationkelas JavaFX . Mungkin Anda tidak terbiasa dengan kelas ini dan memiliki pertanyaan tentang penggunaan Applicationdan tentang apa yang ditawarkan kelas ini kode aplikasi Anda. Posting ini mencoba menjawab pertanyaan-pertanyaan ini sambil menjelajah Application.

Memperkenalkan Aplikasi

The javafx.application.Applicationkelas menyediakan kerangka kerja untuk mengelola aplikasi JavaFX. Aplikasi ini harus menyertakan kelas yang meluas Application, menggantikan berbagai metode yang dipanggil runtime JavaFX untuk mengeksekusi kode khusus aplikasi.

Aplikasi dapat memanggil Applicationmetode untuk mendapatkan parameter startup, mengakses layanan host, mengatur peluncuran sendiri sebagai aplikasi mandiri, berinteraksi dengan prapemuat (aplikasi kecil yang dimulai sebelum aplikasi utama untuk menyesuaikan pengalaman startup), dan mengakses agen pengguna ( Web browser) style sheet.

Gaya aplikasi

Aplikasi JavaFX dapat diluncurkan sebagai aplikasi mandiri, sebagai applet, dan sebagai aplikasi Java WebStart. Saya hanya mendemonstrasikan gaya aplikasi mandiri dalam posting ini.

Siklus hidup aplikasi

Salah satu Applicationtugasnya adalah mengelola siklus hidup aplikasi . Metode yang dapat diganti berikut Applicationberperan dalam siklus hidup ini:

  • void init(): Inisialisasi aplikasi. Aplikasi dapat mengganti metode ini untuk melakukan inisialisasi sebelum aplikasi dimulai. Application's init()metode tidak apa-apa.
  • void start(Stage primaryStage): Memulai aplikasi. Aplikasi harus mengganti metode abstrak ini untuk menyediakan titik masuk aplikasi. The primaryStageArgumen menentukan wadah untuk antarmuka pengguna.
  • void stop(): Menghentikan aplikasi. Aplikasi dapat menimpa metode ini untuk mempersiapkan keluarnya aplikasi dan menghancurkan sumber daya. Application's stop()metode tidak apa-apa.

Runtime JavaFX berinteraksi dengan aplikasi dan memanggil metode ini dalam urutan berikut:

  1. Buat instance kelas yang diperluas Application.
  2. Panggil init()di Thread Peluncur JavaFX. Karena init()tidak dipanggil pada Thread Aplikasi JavaFX, ia tidak boleh membuat javafx.scene.Sceneatau javafx.stage.Stageobjek, tetapi dapat membuat objek JavaFX lainnya.
  3. Panggil start()pada Thread Aplikasi JavaFX setelah init()pengembalian dan runtime JavaFX siap untuk aplikasi JavaFX mulai berjalan.
  4. Tunggu aplikasinya selesai. Aplikasi ujungnya ketika memanggil javafx.application.Platform.exit()atau ketika jendela terakhir telah ditutup dan Platform's implicitExitatribut diatur ke true.
  5. Panggil stop()di Thread Aplikasi JavaFX. Setelah metode ini kembali, aplikasi keluar.

JavaFX membuat thread aplikasi, yang dikenal sebagai JavaFX Application Thread , untuk menjalankan aplikasi start()dan stop()metode, untuk memproses kejadian input, dan untuk menjalankan garis waktu animasi. Membuat JavaFX Scenedan Stageobjek serta menerapkan operasi modifikasi grafik adegan ke objek langsung (objek yang sudah terpasang ke adegan) harus dilakukan pada Thread Aplikasi JavaFX.

Alat javapeluncur memuat dan menginisialisasi Applicationsubkelas yang ditentukan di Thread Aplikasi JavaFX. Jika tidak ada main()metode di Applicationkelas, atau jika main()metode memanggil Application.launch(), turunan dari Applicationsubkelas dibuat di Thread Aplikasi JavaFX.

The init()metode ini disebut pada JavaFX Launcher Thread , yang merupakan benang yang meluncurkan aplikasi; itu tidak disebut di Thread Aplikasi JavaFX. Akibatnya, aplikasi tidak boleh membuat Sceneatau Stageobjek di init(). Namun, aplikasi dapat membuat objek JavaFX lainnya dalam init()metode ini.

Pengecualian yang tidak tertangani

Semua pengecualian yang tidak tertangani yang terjadi pada Thread Aplikasi JavaFX (selama pengiriman peristiwa, menjalankan garis waktu animasi, atau kode lainnya) diteruskan ke pengendali pengecualian thread yang tidak tertangkap.

Kode 1 menyajikan aplikasi JavaFX sederhana yang mendemonstrasikan siklus hidup ini.

Daftar 1. LifeCycle.java

import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; public class LifeCycle extends Application { @Override public void init() { System.out.printf("init() called on thread %s%n", Thread.currentThread()); } @Override public void start(Stage primaryStage) { System.out.printf("start() called on thread %s%n", Thread.currentThread()); Platform.exit(); } @Override public void stop() { System.out.printf("stop() called on thread %s%n", Thread.currentThread()); } }

Susun Daftar 1 sebagai berikut:

javac LifeCycle.java

Jalankan hasil LifeCycle.classsebagai berikut:

java LifeCycle

Anda harus mengamati keluaran berikut:

init() called on thread Thread[JavaFX-Launcher,5,main] start() called on thread Thread[JavaFX Application Thread,5,main] stop() called on thread Thread[JavaFX Application Thread,5,main]

Output menunjukkan bahwa init()dipanggil pada utas yang berbeda dari start()dan stop, yang dipanggil pada utas yang sama. Karena utas berbeda terlibat, Anda mungkin perlu menggunakan sinkronisasi.

Jika Anda berkomentar Platform.exit(), Anda tidak akan mengamati stop() called on thread Thread[JavaFX Application Thread,5,main]pesan tersebut karena runtime JavaFX tidak akan dipanggil stop()- aplikasi tidak akan berakhir.

Parameter aplikasi

Applicationmenyediakan Application.Parameters getParameters()metode untuk mengembalikan parameter aplikasi, yang mencakup argumen yang diteruskan pada baris perintah, parameter tanpa nama yang ditentukan dalam file JNLP (Java Network Launch Protocol), dan pasangan yang ditentukan dalam file JNLP.

Tentang getParameters()

getParameters()bisa disebut di init(), start(), stop()dan setiap metode dipanggil dari metode ini. Ia kembali nullketika dipanggil dari salah satu konstruktor subkelas aplikasi.

Application.Parameters merangkum parameter dan menyediakan metode berikut untuk mengaksesnya:

  • Map getNamed(): Menampilkan peta hanya-baca dari parameter bernama. Peta mungkin kosong tetapi tidak pernah nol. Parameter bernama termasuk pasang eksplisit ditentukan dalam file JNLP, dan argumen baris perintah dalam bentuk: .--name=value
  • List getRaw(): Menampilkan daftar argumen mentah hanya baca. Daftar ini mungkin kosong tetapi tidak pernah nol. Untuk aplikasi mandiri, ini adalah daftar argumen yang diurutkan yang ditentukan pada baris perintah. Untuk aplikasi applet atau WebStart, ini menyertakan parameter tanpa nama serta parameter bernama. Untuk parameter bernama, setiap pasangan direpresentasikan sebagai argumen tunggal dari formulir .--name=value
  • List getUnnamed(): Menampilkan daftar baca-saja dari parameter tak bernama. Daftar ini mungkin kosong tetapi tidak pernah nol. Parameter bernama (yang direpresentasikan sebagai pasangan) disaring.

Kode 2 menyajikan aplikasi JavaFX sederhana yang mendemonstrasikan metode ini.

Daftar 2. Parameters.java

import java.util.List; import java.util.Map; import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; public class Parameters extends Application { @Override public void start(Stage primaryStage) { Application.Parameters parm = getParameters(); System.out.printf("Named parameters: %s%n", parm.getNamed()); System.out.printf("Raw parameters: %s%n", parm.getRaw()); System.out.printf("Unnamed parameters: %s%n", parm.getUnnamed()); Platform.exit(); } }

Susun Daftar 2 sebagai berikut:

javac Parameters.java

Jalankan hasil Parameters.classsebagai berikut:

java Parameters a b c --name=w -name2=x --foo=y -foo=z bar=q

Anda harus mengamati keluaran berikut:

Named parameters: {foo=y, name=w} Raw parameters: [a, b, c, --name=w, -name2=x, --foo=y, -foo=z, -bar=q] Unnamed parameters: [a, b, c, -name2=x, -foo=z, -bar=q]

Layanan tuan rumah

Application provides the HostServices getHostServices() method for accessing the host services provider, which lets the application obtain its code and document bases, show a Web page in a browser, and communicate with the enclosing Web page using JavaScript when running in a browser.

The javafx.application.HostServices class declares the following methods:

  • String getCodeBase(): Get the code base URI for this application. If the application was launched via a JNLP file, this method returns the codebase parameter specified in the JNLP file. If the application was launched in standalone mode, this method returns the directory containing the application JAR file. If the application is not packaged in a JAR file, this method returns the empty string.
  • String getDocumentBase(): Get the document base URI for this application. If the application is embedded in a browser, this method returns the URI of the Web page containing the application. If the application was launched in WebStart mode, this method returns the the codebase parameter specified in the JNLP file (the document base and the code base are the same in this mode). If the application was launched in standalone mode, this method returns the URI of the current directory.
  • JSObject getWebContext(): Return the JavaScript handle of the enclosing DOM window of the Web page containing this application. This handle is used to access the Web page by calling from Java into JavaScript. If the application is not embedded in a Web page, this method returns null.
  • String resolveURI(String base, String rel): Resolve the specified relative URI against the base URI and return the resolved URI. This method throws java.lang.NullPointerException when either the base or the rel strings are null. It throws java.lang.IllegalArgumentException when there is an error parsing either the base or rel URI strings, or when there is any other error in resolving the URI.
  • void showDocument(String uri): Open the specified URI in a new browser window or tab. The determination of whether it is a new browser window or a tab in an existing browser window will be made by the browser preferences. Note that this will respect the pop-up blocker settings of the default browser; it will not try to circumvent them.

Listing 3 presents a simple JavaFX application that demonstrates most of these methods.

Listing 3. HostServ.java

import javafx.application.Application; import javafx.application.HostServices; import javafx.application.Platform; import javafx.stage.Stage; public class HostServ extends Application { @Override public void start(Stage primaryStage) { HostServices hs = getHostServices(); System.out.printf("Code base: %s%n", hs.getCodeBase()); System.out.printf("Document base: %s%n", hs.getDocumentBase()); System.out.printf("Web context: %s%n", hs.getWebContext()); Platform.exit(); } }

Compile Listing 3 as follows:

javac HostServ.java

Run the resulting HostServ.class as follows:

java HostServ

You should observe something similar to the following output:

Code base: Document base: file:/C:/cpw/javaqa/article19/code/HostServ/ Web context: null

Launching a standalone application

A JavaFX application doesn't require a main() method. The JavaFX runtime takes care of launching the application and saving command-line arguments. However, if you need to perform various tasks before the application is launched, you can specify a main() method and have it invoke one of the following static methods:

  • void launch(Class appClass, String... args): Launch a standalone application, where appClass identifies the class that's constructed and executed by the launcher, and args identifies the command-line arguments that are passed to the application. This method doesn't return until the application has exited, either via Platform.exit() or by all of the application windows having been closed. It throws java.lang.IllegalStateException when invoked more than once, and throws IllegalArgumentException when appClass doesn't subclass Application.
  • void launch(String... args): Launch a standalone application. This method is equivalent to invoking the previous method with the Class object of the immediately enclosing class of the method that called launch().

Listing 4 presents a simple JavaFX application that demonstrates the second launch() method.

Listing 4. Launch.java

import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; public class Launch extends Application { @Override public void start(Stage primaryStage) { System.out.printf("start() called on %s%n", Thread.currentThread()); Platform.exit(); } public static void main(String[] args) { System.out.printf("main() called on %s%n", Thread.currentThread()); Application.launch(args); System.out.printf("terminating"); } }

Compile Listing 4 as follows:

javac Launch.java

Jalankan hasil Launch.classsebagai berikut:

java Launch

Anda harus mengamati keluaran berikut:

main() called on Thread[main,5,main] start() called on Thread[JavaFX Application Thread,5,main] terminating