Aplikasi JavaFX didasarkan pada Application
kelas JavaFX . Mungkin Anda tidak terbiasa dengan kelas ini dan memiliki pertanyaan tentang penggunaan Application
dan tentang apa yang ditawarkan kelas ini kode aplikasi Anda. Posting ini mencoba menjawab pertanyaan-pertanyaan ini sambil menjelajah Application
.
Memperkenalkan Aplikasi
The javafx.application.Application
kelas 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 Application
metode 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 Application
tugasnya adalah mengelola siklus hidup aplikasi . Metode yang dapat diganti berikut Application
berperan dalam siklus hidup ini:
void init()
: Inisialisasi aplikasi. Aplikasi dapat mengganti metode ini untuk melakukan inisialisasi sebelum aplikasi dimulai.Application
'sinit()
metode tidak apa-apa.void start(Stage primaryStage)
: Memulai aplikasi. Aplikasi harus mengganti metode abstrak ini untuk menyediakan titik masuk aplikasi. TheprimaryStage
Argumen menentukan wadah untuk antarmuka pengguna.void stop()
: Menghentikan aplikasi. Aplikasi dapat menimpa metode ini untuk mempersiapkan keluarnya aplikasi dan menghancurkan sumber daya.Application
'sstop()
metode tidak apa-apa.
Runtime JavaFX berinteraksi dengan aplikasi dan memanggil metode ini dalam urutan berikut:
- Buat instance kelas yang diperluas
Application
. - Panggil
init()
di Thread Peluncur JavaFX. Karenainit()
tidak dipanggil pada Thread Aplikasi JavaFX, ia tidak boleh membuatjavafx.scene.Scene
ataujavafx.stage.Stage
objek, tetapi dapat membuat objek JavaFX lainnya. - Panggil
start()
pada Thread Aplikasi JavaFX setelahinit()
pengembalian dan runtime JavaFX siap untuk aplikasi JavaFX mulai berjalan. - Tunggu aplikasinya selesai. Aplikasi ujungnya ketika memanggil
javafx.application.Platform.exit()
atau ketika jendela terakhir telah ditutup danPlatform
'simplicitExit
atribut diatur ketrue
. - 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 Scene
dan Stage
objek serta menerapkan operasi modifikasi grafik adegan ke objek langsung (objek yang sudah terpasang ke adegan) harus dilakukan pada Thread Aplikasi JavaFX.
Alat java
peluncur memuat dan menginisialisasi Application
subkelas yang ditentukan di Thread Aplikasi JavaFX. Jika tidak ada main()
metode di Application
kelas, atau jika main()
metode memanggil Application.launch()
, turunan dari Application
subkelas 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 Scene
atau Stage
objek 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.class
sebagai 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
Application
menyediakan 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 null
ketika 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.class
sebagai 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 returnsnull
.String resolveURI(String base, String rel)
: Resolve the specifiedrel
ative URI against thebase
URI and return the resolved URI. This method throwsjava.lang.NullPointerException
when either thebase
or therel
strings arenull
. It throwsjava.lang.IllegalArgumentException
when there is an error parsing either thebase
orrel
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, whereappClass
identifies the class that's constructed and executed by the launcher, andargs
identifies the command-line arguments that are passed to the application. This method doesn't return until the application has exited, either viaPlatform.exit()
or by all of the application windows having been closed. It throwsjava.lang.IllegalStateException
when invoked more than once, and throwsIllegalArgumentException
whenappClass
doesn't subclassApplication
.void launch(String... args)
: Launch a standalone application. This method is equivalent to invoking the previous method with theClass
object of the immediately enclosing class of the method that calledlaunch()
.
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.class
sebagai 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