JavaFX, WPF ile karşılaştırıldığında nasıldır? [kapalı]


94

Çoğunlukla bir C # programcısıyım, yaklaşık 10 yıl önce Java yazmayı bıraktım, ancak makaleler okuyarak, arkadaşlarla konuşarak vb. Java teknolojisine ayak uydurmaya çalışıyorum.

JavaFX adlı yeni zengin GUI çerçevesini duydum, ancak Java dışı paralelliklerle karşılaştıran herhangi bir kaynak bulamadım.

C # ve WPF'ye çok aşina olduğum için, iki teknolojinin ne kadar benzer veya farklı olduğu hakkında bir fikir edinmek istiyorum.

DÜZENLEME: Yanıtın gelmediğini görünce, daha spesifik olmaya çalışacağım:

  1. WPF, görsel ağacı oluşturmak için XAML kullanır, JavaFX'te benzer bir şey var mı?
  2. WPF, bir MVVM modelindeki bir görünüm modeline bağlanmada en iyi şekilde kullanılır, JavaFX ayrıca bağlamayı kapsamlı bir şekilde kullanır mı?
  3. WPF, oluşturma için GPU'yu kullanır, JavaFX de aynısını yapar mı?
  4. Silverlight, net bilgisayardaki bir tarayıcıda çalıştırıldığında JavaFX ile karşılaştırıldığında nasıldır?

... Gelmek için daha fazla...

Bunu topluluk wiki olarak değiştiriyorum, böylece karşılaştırmalar güncellenmeye devam edebilsin (umarım).


7
83 olumlu oy içeren bir sorunun yapıcı olmadığı düşünülebilir.
kristianp

Yanıtlar:


121

Son birkaç haftadır JavaFX öğreniyorum. İşte gözlerimde WPF ile nasıl karşılaştırıldığına dair üst düzey bir genel bakış:

Tüm yorumlarım JavaFX 2.0 ile ilgilidir. Platform henüz olgunlaşmadığı ve aktif olarak geliştirildiği için bu bilgiler muhtemelen değişebilir.

Grafikler

WPF gibi, JavaFX de tutulan bir grafik oluşturma sistemi kullanır. Kullanıcı arayüzü, kavramsal olarak WPF'lere benzediği düşünülebilecek 'düğümlerden' oluşan bir sahne grafiğinden oluşur UIElement.

JavaFX, mevcutsa grafik işlemeyi GPU'ya aktarır. Grafik sistemi Windows'ta DirectX'i ve diğer platformlarda OpenGL'yi kullanır.

İşaretleme

JavaFX kullanıcı arabirimleri, hem kodda hem de XAML'ye benzer FXML işaretlemesi aracılığıyla oluşturulabilir, çünkü nesne grafiği iç içe öğelerle oluşturulabilir.

FXML, özellik bağlama (yalnızca basit ifadeler) ve olay işleyicilerine bağlama (herhangi bir onEvent yöntemi) gibi XAML'ye benzer bazı özelliklere sahiptir . Olay işleyicileri satır içi olarak bildirilebilir, ancak genellikle ilişkili denetleyicideki bir olaya bağlanırsınız.

FXML dosyaları, karmaşık olay işleyicileri bildirmenize ve özellikler arasında bağlar kurmanıza izin veren ilişkili bir denetleyiciye sahip olabilir. Bu, MVC anlamında bir denetleyicidir ve WPF dünyasındaki bir viewModel ile aynı değildir (tipik olarak bir denetleyicinin düğümlere ve denetimlere başvuruları olacaktır).

WPF için bir farkı FXML anlaşılıyor ki değil BAML gibi bir ara ikili gösterim içine derlenmiş. Henüz herhangi bir performans sorunu fark etmedim ancak sistemi kapsamlı bir şekilde kullanmadım. Yine de fark ettim ki, FXML genellikle herhangi bir XAML'den daha kısa olma eğilimindedir, çünkü platform hala sizi kod yazmaya teşvik eder ve stiller ayrı olarak bildirilir.

FXML'ye giriş burada bulunabilir .

Bir sahne oluşturucu ücretsiz olarak sağlanır (birada olduğu gibi), bu nedenle kullanıcı arayüzünü elle kodlamayı sevmiyorsanız, öğeleri sürükleyip bırakabilir, denetleyicinizde özellikleri ayarlayabilir ve koda bağlanabilirsiniz; FXML otomatik olarak oluşturulacaktır. Açıkçası sahne oluşturucu, İfade Karışımı kadar güçlü değildir, ancak yine de Visual Studio tarafından sağlanan 'tasarımcı'dan daha iyidir.

Bağlayıcı

JavaFX çok güçlü bir özelliğe ve bağlama sistemine sahiptir. Java Bean kalıbı, bir özelliği kapsayan sınıfları içerecek şekilde genişletilmiştir (WPF bağımlılık özelliklerinin özellikleri temsil etme şekline benzer). Bu sınıflar, geçersiz kılma ve değişiklik bildirimi sağlayan arabirimler uygular.

Geçersiz kılma bildirimleri ile değişiklik bildirimleri arasında bir ayrım vardır. Geçersiz kılar size sadece bağlama ifadesinin artık geçersiz olduğunu ve yeniden hesaplanması gerektiğini söyler; yeniden hesaplama, siz get()veya getValue()yöntemleri aracılığıyla özellik değerini talep edene kadar gerçekleşmez . Ancak bir değişiklik dinleyicisi kaydettiyseniz, ifade hemen yeniden değerlendirilecek ve bu özelliğe bağlı olan her şey değişiklikleri yansıtacaktır.

JavaFX, bu özellikleri bir get ve set özelliği ve özellik sarmalayıcısının bir örneğini (WPF özellikleri gibi statik olmayan) döndüren bir yöntemle WPF'ye benzer şekilde ortaya çıkarır.

Birden çok özellik arasında karmaşık bağlamalar oluşturulabilir . Bir tamsayı özelliğinin diğer iki özelliğin toplamı olmasını ister misiniz (a = b + c)? Sorun değil, JavaFX bu tür ilişkileri ifade etmek için bir Fluent API sağlar.

A. Ekle (B, C);

B veya C'nin değeri değişirse, sistemin A'nın yeniden değerlendirilmesi gerektiğini bilmesi için uygun bildirimler yükseltilecektir. Bu durumda, diğer özelliklere bağlı olduğu için A'nın değerini ayarlar ve ayarlarsanız, bu bağlamda bir anlam ifade etmemesi için bir istisna atılacağını unutmayın.

Bu ifadeler oldukça karmaşık EG a = (b + c) * (d - e)olabilir ve herhangi bir sayıda özellik içerebilir. Akıcı API'nin okunması ve kullanılması oldukça kolaydır, ancak bazı Microsoft kitaplıkları tarafından sağlanan bazı Fluent API'leri kadar hoş değildir ancak bu, JavaFX'in kendisinden çok Java dil sınırlamalarına bağlıdır.

Aynı türdeki özellikler arasında basit çift yönlü bağlamalar oluşturulabilir, böylece biri güncellenirse diğeri otomatik olarak değişikliği yansıtır.

JavaFX ayrıca, API tarafından sağlanmayan özel bir bağlama ifadesi oluşturmak istiyorsanız veya performans konusunda endişeleriniz varsa, bağlamaları kendiniz özelleştirmek için düşük seviyeli bir API sağlar.

JavaFX ve WPF arasındaki en büyük farklardan biri, bağlamaların öncelikli olarak JavaFX'te kod içinde gerçekleştirilmesi ve işaretlemede bağlama oluşturmanın WPF yöntemidir.

Özelliklere ve bağlamalara giriş burada bulunabilir .

Stilleri

JavaFX, sahne grafiğinde bulunan düğümlerin görünümünü değiştirmek için CSS kullanır. Her bir düğüm türünde ayarlanabilecek türleri ve özellikleri açıklayan tam bir teknik özellik mevcuttur.

JavaFX ayrıca, başka yerlerde tanımlanabilen ve kullanılabilen değişkenler gibi CSS'yi iyileştirmeye yardımcı olan bazı eklemeler de sağlar.

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

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

Ayrıca, degradeler gibi şeyler oluşturmak için yararlı olan, önceden tanımlanmış diğer renklerden renkleri türetmenize olanak tanıyan birkaç işlev sağlar. Bu, temel bir renk paletinin tanımlanabileceği ve geri kalanının bu değerlerden oluşturulabileceği anlamına gelir (varsayılan JavaFX CSS dosyasının yaptığı şey budur).

JavaFX CSS, bir düğüm tarafından kullanılan mizanpaj türünü tanımlamanıza izin vermez (bunu yazarken tüm mizanpajın kodda gerçekleştirilmesi gerekir). Bu benim için gerçekten işe yarıyor, çünkü CSS'nin HTML ile kullanırken bana gerçekten acı veren bir yönü buydu.

Şahsen ben CSS'yi, beğenmek için fazla ayrıntılı olma eğiliminde olan XAML stillerine tercih ediyorum.

JavaFX CSS ile ilgili bir kılavuz burada bulunabilir .

Yerleşim

JavaFX, WPF tarafından sağlananlara benzer bir dizi düzen bölmesi sağlar. Fark ettiğim bir fark, ölçü ve düzen sözleşmesinin Regionsınıftaki miras zincirinin ilerleyen kısımlarında tanımlanmış olmasıdır .

Daha önce belirtildiği gibi, Mizanpaj CSS kullanılarak gerçekleştirilemez ancak kod, FXML kullanılarak ifade edilebilir veya sahne oluşturucu kullanılarak oluşturulabilir (sonuçta FXML'ye dönüştürülür).

Kontroller

JavaFX, beklediğimiz sürekli büyüyen bir kontrol kütüphanesi sağlar. JavaFX ve WPF arasındaki önemli bir fark, kontrollerin esasen kara kutular olması ve WPF kontrollerinin yapabileceği şekilde yeniden şablonlanamamasıdır. Ayrıca, WPF kontrollerinden çok daha az özellik ortaya koyuyorlar.

Kontroller, uygulamaya özgü bazı bölgeleri CSS'ye maruz bırakır ve bir kontrolün belirli alanlarının stilleriniz tarafından hedeflenmesine izin verir. Bu, kontrolün alt yapısı olarak bilinir . EG a CheckBoxiki alt yapıyı ortaya çıkarır; kutu ve onay işareti, kontrolün her bir parçasının bağımsız olarak stilize edilmesini sağlar. Daha önce açıklandığı gibi, yalnızca bir kontrolün görünümünün CSS kullanılarak değiştirilebileceğini, ancak hissin değiştirilemeyeceğini unutmayın. Örneğin TabPane, WPF ile yapabileceğiniz şekilde dahili düzen panelini değiştirerek, a'nın içeriğini düzenleme şeklini önemli ölçüde değiştiremezsiniz TabControl.

Bu oldukça sınırlayıcı görünse de, JavaFX'te özel kontroller oluşturmanın tercih edilen yolu, standart kontrolleri konumlandırmak ve CSS kullanarak yeniden şekillendirmek için bir düzen panelinden türetme hatları boyunca kompozisyon kullanmak gibi görünüyor.

Sonuç

Genel olarak JavaFX'in şu anda sunduklarından çok etkilendim. WPF kadar olgun bir yerde olmasa da, aktif olarak geliştiriliyor ve Oracle kesinlikle bunu destekliyor gibi görünüyor. Başarılı olup olmadığını zaman gösterecek.

JavaFX'i denemenizi tavsiye ederim. Belgeleri okuyun ve küçük bir uygulama oluşturmayı deneyin ve ne düşündüğünüzü görün.

Ayrıca geliştirme ekibinden gelen bilgilerle düzenli olarak güncellenen FXExperience.com sitesine de göz atmalısınız .


9
Bunun için çok teşekkürler, bu çok eğitici. JavaFX bilginizde ilerledikçe bu yanıtı daha da geliştirebilirseniz harika olur.
Aviad P.

5
Ayrıca cevabınızı okumaktan da zevk aldım ve JavaFX ile yaptığınız çalışmanız daha fazla fikir ortaya koyarsa daha fazlasını duymak isterim.
Paul-Sebastian Manole

21

JavaFX hakkında bir fikir edinmenin en iyi yolu onu denemektir. JavaFX web sitesinde bazı iyi eğitimler var. İşte bir çift:

Oldukça hızlılar ve size dil için iyi bir his veriyorlar. Daha fazla öğretici ve makale ile ilgileniyorsanız , JavaFX sitesinde başka pek çok şey var.

Sorularınıza özel cevaplar için:

  1. JavaFX, xml türevi olmayan "görsel ağacı" oluşturmak için kendi bildirim diline sahiptir. Kullanıcı arayüzü bir sahne grafiğine dayalıdır, böylece grafikteki herhangi bir düğüme çeşitli efektler ve animasyonlar uygulayabilirsiniz. Daha fazla bilgi için eğitimlere bakın. Ayrıca JavaFX için (henüz denemediğim) bir tasarım aracı da var.
  2. JavaFX, dilde yerleşik bağlama içerir .
  3. Masaüstündeki JavaFX, GPU oluşturmayı kullanan Java AWT / Swing'i kullanır. Java'nın her sürümü, grafiklerinin çoğunu GPU'ya aktarıyor gibi görünüyor. Sun'dan Chris Campbell, GPU hızlandırma hakkında bazı bloglar yazdı . JavaFX'in mobil sürümünde GPU hızlandırması olup olmadığından emin değilim. JavaFX'in önceki sürümlerinin ihtiyacım olan şey için yeterince performanslı olmadığını buldum, ancak en son sürümün önceki sürümlere göre önemli performans iyileştirmeleri olduğunu ve hala daha hızlı hale getirmek için çalıştıklarını biliyorum.
  4. JavaFx, tarayıcıda çalıştırmak için Java Uygulamalarını kullanır. Java 6 güncelleme 10'dan itibaren, Java uygulama çerçevesi yeniden çalışıldı ve Adobe flash kadar kusursuz olmasa da çok geliştirildi. Silverlight'ı Linux üzerinde çalıştırmakta sorun yaşadığım dışında Silverlight'a kıyasla nasıl olduğundan emin değilim, ancak JavaFX Linux üzerinde çalışıyor.

İşte ilgili başka bir soru .


15
JavaFX, Java 7'de önemli güncellemelerden geçtiği için bu yanıt geçerliliğini yitirmiştir. Buraya bakın .
Zoltán

7
JavaFX'in swing ve AWT kullandığından emin misiniz? Prism adı verilen kendi oluşturma motoruna sahip olduğuna inanıyorum. JavaFX uygulaması çalıştırılırken Olay Gönderme dizisi oluşturulmaz.
Andy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.