Bagaimana JavaFX dibandingkan dengan WPF? [Tutup]

93

Saya kebanyakan seorang programmer C #, saya berhenti menulis Java sekitar 10 tahun yang lalu, tetapi saya mencoba mengikuti teknologi di Java dengan membaca artikel, berbicara dengan teman, dll.

Saya pernah mendengar tentang kerangka GUI kaya baru yang disebut JavaFX, tetapi tidak dapat menemukan sumber daya apa pun yang membandingkannya dengan paralel non-Java.

Karena saya sangat akrab dengan C # dan WPF, saya ingin mengetahui seberapa mirip atau berbeda kedua teknologi tersebut.

EDIT: Karena tidak ada jawaban yang datang, saya akan mencoba lebih spesifik:

  1. WPF menggunakan XAML untuk membuat pohon visual, apakah JavaFX memiliki sesuatu yang serupa?
  2. WPF paling baik digunakan dengan pengikatan ke model tampilan dalam pola MVVM, apakah JavaFX juga menggunakan pengikatan secara ekstensif?
  3. WPF menggunakan GPU untuk rendering, apakah JavaFX melakukan hal yang sama?
  4. Bagaimana Silverlight dibandingkan dengan JavaFX saat dijalankan melalui browser di komputer internet?

... Akan datang lebih banyak lagi...

Saya mengubah ini ke wiki komunitas sehingga perbandingan dapat terus diperbarui (semoga).

Aviad P.
sumber
7
Lucu bahwa pertanyaan dengan 83 suara positif dapat dianggap tidak membangun.
kristianp

Jawaban:

120

Saya telah mempelajari JavaFX selama beberapa minggu terakhir. Berikut adalah ikhtisar tingkat tinggi tentang bagaimana perbandingannya dengan WPF di mata saya:

Semua komentar saya terkait dengan JavaFX 2.0. Informasi ini mungkin dapat berubah karena platformnya masih belum matang dan sedang dikembangkan secara aktif.

Grafik

Seperti WPF, JavaFX menggunakan sistem rendering grafis yang dipertahankan. Antarmuka pengguna terdiri dari grafik adegan yang terdiri dari 'node' yang secara konseptual dapat dianggap mirip dengan WPF UIElement.

JavaFX akan memindahkan rendering grafis ke GPU jika tersedia. Sistem grafis menggunakan DirectX di Windows dan OpenGL di platform lain.

Markup

Antarmuka pengguna JavaFX dapat dibuat dalam kode dan melalui markup FXML yang mirip dengan XAML di mana grafik objek dapat dibuat dengan elemen bersarang.

FXML memiliki beberapa fitur yang mirip dengan XAML seperti pengikatan properti (hanya ekspresi sederhana) dan pengikatan ke event handler ( metode onEvent apa pun ). Penangan peristiwa dapat dideklarasikan secara in-line tetapi biasanya Anda akan mengikat peristiwa di pengontrol terkait.

File FXML dapat memiliki pengontrol terkait yang memungkinkan Anda untuk mendeklarasikan penangan kejadian yang kompleks dan mengatur binding antar properti. Ini adalah pengontrol dalam arti MVC dan tidak sama dengan viewModel di dunia WPF (biasanya pengontrol akan memiliki referensi ke node dan kontrol).

Satu perbedaan dengan WPF adalah bahwa FXML tidak dikompilasi menjadi representasi biner perantara seperti BAML. Saya belum melihat masalah kinerja apa pun tetapi belum menggunakan sistem secara ekstensif. Saya perhatikan juga, bahwa FXML biasanya cenderung lebih pendek daripada XAML mana pun karena platform masih mendorong Anda untuk menulis kode dan gaya dideklarasikan secara terpisah.

Pengenalan FXML dapat ditemukan di sini .

Pembangun adegan disediakan gratis (seperti dalam bir), jadi jika Anda tidak suka pengkodean tangan UI, Anda dapat menyeret dan melepaskan elemen, mengatur properti dan mengikat ke kode di pengontrol Anda dan FXML akan dibuat secara otomatis. Jelas pembangun adegan tidak sekuat Expression Blend tetapi masih lebih baik daripada 'desainer' yang disediakan oleh Visual Studio.

Mengikat

JavaFX memiliki properti dan sistem pengikatan yang sangat kuat. Pola Java Bean telah diperluas untuk menyertakan kelas yang merangkum properti (mirip dengan cara properti ketergantungan WPF merepresentasikan properti). Kelas-kelas ini mengimplementasikan antarmuka yang memberikan pembatalan dan pemberitahuan perubahan.

Ada perbedaan antara pemberitahuan pembatalan dan pemberitahuan perubahan. Invalidasi hanya memberi tahu Anda bahwa ekspresi binding sekarang tidak valid dan perlu dihitung ulang; penghitungan ulang tidak benar-benar terjadi hingga Anda meminta nilai properti melalui metode get()atau getValue(). Namun, jika Anda telah mendaftarkan pemroses perubahan, ekspresi akan segera dievaluasi ulang dan apa pun yang terikat ke properti itu akan mencerminkan perubahan tersebut.

JavaFX mengekspos properti ini dengan cara yang mirip dengan WPF dengan properti get and set dan metode yang mengembalikan instance wrapper properti (yang tidak statis seperti properti WPF).

Binding kompleks dapat dibuat di antara beberapa properti. Ingin properti integer menjadi hasil penjumlahan dari dua lainnya (a = b + c)? Tidak masalah, JavaFX menyediakan Fluent API untuk mengekspresikan hubungan semacam ini EG

A. Tambahkan (B, C);

Jika nilai B atau C berubah maka pemberitahuan yang sesuai akan dimunculkan sehingga sistem mengetahui bahwa A perlu dievaluasi ulang. Perhatikan bahwa dalam kasus ini, pengecualian akan muncul jika Anda mencoba dan menyetel nilai A karena terikat ke properti lain sehingga tidak masuk akal dalam konteks ini.

Ekspresi ini dapat menjadi EG yang cukup kompleks a = (b + c) * (d - e)dan dapat menyertakan sejumlah properti. Fluent API cukup mudah untuk dibaca dan digunakan tetapi tidak sebaik beberapa API Fluent yang disediakan oleh beberapa perpustakaan Microsoft tetapi ini lebih mengarah pada batasan bahasa Java daripada JavaFX itu sendiri.

Binding dua arah sederhana dapat dibuat antara properti dengan tipe yang sama sehingga jika salah satu diperbarui, yang lain secara otomatis mencerminkan perubahan.

JavaFX juga menyediakan API tingkat rendah untuk menyesuaikan sendiri binding jika Anda ingin membuat ekspresi binding kustom yang tidak disediakan oleh API atau jika Anda mengkhawatirkan performa.

Salah satu perbedaan terbesar antara JavaFX dan WPF adalah bahwa binding terutama dilakukan dalam kode di JavaFX vs. cara WPF untuk membuat binding dalam mark-up.

Pengenalan tentang properti dan binding dapat ditemukan di sini .

Gaya

JavaFX menggunakan CSS untuk mengubah tampilan node yang terdapat dalam grafik adegan. Tersedia spesifikasi lengkap yang menjelaskan jenis dan properti yang dapat disetel pada setiap jenis node.

JavaFX juga menyediakan beberapa tambahan yang membantu meningkatkan CSS seperti variabel yang dapat didefinisikan dan digunakan di tempat lain EG

.button {
    my-custom-color: RGB(234, 44, 78);
}

.my-control {
    -fx-background-color: my-custom-color
}

Ini juga menyediakan beberapa fungsi yang memungkinkan Anda mendapatkan warna dari warna lain yang ditentukan sebelumnya yang berguna untuk membuat hal-hal seperti gradien. Ini berarti palet warna dasar dapat ditentukan dan sisanya dapat dihasilkan dari nilai-nilai ini (inilah yang dilakukan file CSS JavaFX default).

JavaFX CSS tidak mengizinkan Anda untuk menentukan jenis tata letak yang digunakan oleh sebuah node (pada saat penulisan ini semua tata letak perlu dilakukan dalam kode). Ini bekerja dengan sangat baik bagi saya karena ini adalah salah satu aspek CSS yang benar-benar membuat saya kesakitan saat menggunakannya dengan HTML.

Secara pribadi saya lebih suka gaya CSS ke XAML yang cenderung terlalu bertele-tele untuk saya sukai.

Panduan untuk JavaFX CSS dapat ditemukan di sini .

Tata Letak

JavaFX menyediakan sejumlah panel tata letak yang mirip dengan yang disediakan oleh WPF. Satu perbedaan yang saya perhatikan adalah bahwa kontrak ukuran dan tata letak didefinisikan lebih jauh dalam rantai warisan di Regionkelas.

Seperti yang disebutkan sebelumnya, Tata Letak tidak dapat dilakukan menggunakan CSS tetapi dapat diekspresikan menggunakan kode, FXML atau dibuat menggunakan pembuat adegan (yang akhirnya diubah menjadi FXML).

Kontrol

JavaFX menyediakan pustaka kontrol yang terus berkembang yang kami harapkan. Satu perbedaan utama antara JavaFX dan WPF adalah bahwa kontrol pada dasarnya adalah kotak hitam dan tidak dapat dibuat ulang template seperti yang dapat dilakukan oleh kontrol WPF. Mereka juga tampaknya mengekspos properti yang jauh lebih sedikit daripada kontrol WPF.

Kontrol tersebut mengekspos beberapa implementasi wilayah tertentu ke CSS yang memungkinkan area tertentu dari kontrol untuk ditargetkan oleh gaya Anda. Ini dikenal sebagai substruktur kontrol. EG a CheckBoxmemperlihatkan dua substruktur; kotak dan tanda centang yang memungkinkan setiap bagian dari kontrol untuk ditata secara terpisah. Perhatikan bahwa seperti yang dijelaskan sebelumnya hanya tampilan kontrol yang dapat diubah menggunakan CSS tetapi rasanya tidak bisa. Misalnya, Anda tidak dapat secara dramatis mengubah cara TabPanetata letak isinya dengan mengubah panel tata letak internalnya seperti yang Anda bisa dengan WPF TabControl.

Meskipun ini terdengar cukup membatasi, cara yang disukai untuk membuat kontrol khusus di JavaFX tampaknya menggunakan komposisi di sepanjang garis yang diturunkan dari panel tata letak untuk memposisikan kontrol standar dan menatanya kembali menggunakan CSS.

Kesimpulan

Secara keseluruhan saya sangat terkesan dengan apa yang ditawarkan JavaFX saat ini. Sementara itu tidak sedekat WPF, itu sedang dikembangkan secara aktif dan Oracle tampaknya mendukung ini. Waktu akan memberi tahu apakah itu berhasil atau tidak.

Saya akan merekomendasikan untuk mencoba JavaFX. Baca dokumentasi dan coba buat aplikasi kecil dan lihat apa yang Anda pikirkan.

Anda juga harus memeriksa FXExperience.com yang diperbarui secara berkala dengan informasi dari tim pengembangan.

Benjamin
sumber
9
Terima kasih banyak untuk ini, ini sangat mendidik. Jika Anda dapat lebih meningkatkan jawaban ini saat Anda semakin maju dalam pengetahuan Anda tentang JavaFX, itu akan luar biasa.
Aviad P.
5
Saya juga senang membaca jawaban Anda dan ingin mendengar lebih banyak lagi jika pekerjaan Anda dengan JavaFX mengungkapkan wawasan lebih jauh.
Paul-Sebastian Manole
21

Saya pikir cara terbaik untuk merasakan JavaFX adalah dengan mencobanya. Ada beberapa tutorial bagus di situs JavaFX. Ini beberapa:

Mereka cukup cepat dan memberi Anda pemahaman yang baik tentang bahasanya. Ada banyak lagi di situs JavaFX jika Anda tertarik dengan lebih banyak tutorial dan artikel.

Untuk jawaban spesifik atas pertanyaan Anda:

  1. JavaFX memiliki bahasa deklaratifnya sendiri untuk membuat "pohon visual" yang bukan merupakan turunan xml. UI didasarkan pada grafik pemandangan sehingga Anda dapat menerapkan berbagai efek dan animasi ke simpul mana pun dalam grafik. Lihat tutorial untuk informasi lebih lanjut. Ada juga alat desainer untuk JavaFX (yang belum saya coba).
  2. JavaFX memiliki pengikatan bawaan ke dalam bahasa .
  3. JavaFX di desktop menggunakan Java AWT / Swing yang menggunakan rendering GPU. Setiap versi Java tampaknya memindahkan lebih banyak grafisnya ke GPU. Chris Campbell dari Sun telah membuat blog tentang akselerasi GPU . Saya tidak yakin apakah versi seluler JavaFX memiliki akselerasi GPU. Saya menemukan bahwa versi JavaFX sebelumnya tidak cukup berkinerja untuk apa yang saya butuhkan, tetapi saya tahu versi terbaru memang memiliki peningkatan kinerja yang signifikan dari versi sebelumnya dan mereka masih bekerja untuk membuatnya lebih cepat.
  4. JavaFx menggunakan Java Applet untuk dijalankan di browser. Pada Java 6 update 10, framework applet Java telah dikerjakan ulang dan meskipun tidak semulus Adobe flash, framework ini jauh lebih baik. Saya tidak yakin bagaimana perbandingannya dengan Silverlight selain saya mengalami masalah dalam membuat Silverlight berfungsi di Linux, tetapi JavaFX berfungsi di Linux.

Berikut pertanyaan terkait lainnya .

Jay Askren
sumber
15
Jawaban ini sudah ketinggalan zaman karena JavaFX telah melalui pembaruan yang signifikan di Java 7. Lihat disini .
Zoltán
7
Apakah Anda yakin JavaFX menggunakan swing dan AWT? Saya yakin ini memiliki mesin render sendiri yang disebut prisma. Tidak ada thread Event Dispatch yang dibuat saat menjalankan aplikasi JavaFX.
Andy Hingga