Gunakan Platform.runLater(...)
untuk operasi cepat dan sederhana dan Task
untuk operasi kompleks dan besar.
Contoh: Mengapa tidak bisa kita gunakan Platform.runLater(...)
untuk perhitungan panjang (Diambil dari referensi di bawah).
Masalah: Utas latar belakang yang hanya menghitung dari 0 hingga 1 juta dan memperbarui bilah kemajuan di UI.
Kode menggunakan Platform.runLater(...)
:
final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
@Override public void run() {
for (int i = 1; i <= 1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
bar.setProgress(counter / 1000000.0);
}
});
}
}).start();
Ini adalah sebongkah kode yang mengerikan, kejahatan terhadap alam (dan pemrograman secara umum). Pertama, Anda akan kehilangan sel-sel otak hanya dengan melihat sarang ganda Runnable ini. Kedua, itu akan membanjiri antrian acara dengan Runnable kecil - sejuta di antaranya sebenarnya. Jelas, kami membutuhkan beberapa API untuk mempermudah menulis pekerja latar belakang yang kemudian berkomunikasi kembali dengan UI.
Kode menggunakan Tugas:
Task task = new Task<Void>() {
@Override public Void call() {
static final int max = 1000000;
for (int i = 1; i <= max; i++) {
updateProgress(i, max);
}
return null;
}
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
itu tidak memiliki kekurangan yang ditunjukkan pada kode sebelumnya
Referensi:
Worker Threading di JavaFX 2.0
Platform.runLater
: Jika Anda perlu memutakhirkan komponen GUI dari utas non-GUI, Anda dapat menggunakannya untuk meletakkan pemutakhiran dalam antrian dan itu akan ditangani oleh utas GUI secepat mungkin.Task
mengimplementasikanWorker
antarmuka yang digunakan saat Anda perlu menjalankan tugas yang lama di luar utas GUI (untuk menghindari pembekuan aplikasi Anda) tetapi masih perlu berinteraksi dengan GUI pada tahap tertentu.Jika Anda terbiasa dengan Swing, yang pertama sama dengan
SwingUtilities.invokeLater
konsep Swing dan yang terakhirSwingWorker
.The javadoc dari Task memberikan banyak contoh yang harus menjelaskan bagaimana mereka dapat digunakan. Anda juga bisa merujuk ke tutorial tentang konkurensi .
sumber
Platform.runLater(new Runnable() {public void run() {updateYourGuiHere();}});
Sekarang dapat diubah ke versi lambda
@Override public void actionPerformed(ActionEvent e) { Platform.runLater(() -> { try { //an event with a button maybe System.out.println("button is clicked"); } catch (IOException | COSVisitorException ex) { Exceptions.printStackTrace(ex); } }); }
sumber
Platform.runLater(() -> progressBar.setProgress(X/Y));
Salah satu alasan untuk menggunakan explicite Platform.runLater () mungkin karena Anda mengikat properti di ui ke properti layanan (hasil). Jadi jika Anda memperbarui properti layanan terikat, Anda harus melakukan ini melalui runLater ():
Dalam thread UI juga dikenal sebagai thread Aplikasi JavaFX:
dalam implementasi Layanan (pekerja latar belakang):
... Platform.runLater(() -> result.add("Element " + finalI)); ...
sumber