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 Region
sı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 CheckBox
iki 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 .