Java GUI çerçeveleri. Ne seçeceksin? Salıncak, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [kapalı]


228

Java için oldukça fazla gui çerçevesi var, ama bugünün seçim çerçevesi olarak kabul edilen nedir?

Aşağıdaki farklı çerçeveleri anlayışım, lütfen yanlışsam beni düzeltin. Bu çok gevşek bir şekilde tanımlanmış bir dizi soru, ama yine de zengin gui uygulamaları oluşturmayı düşünen herkes için değerli olduğunu düşünüyorum.


AWT

Salıncağın temeli, iyi performans gösterir, ancak gelişmiş bileşenlerde yoktur. Zengin uygulamalar oluşturmayı düşünüyorsanız, AWT muhtemelen gidilecek yol değildir. Ancak, zengin kullanıcı arayüzleri gerektirmeyen daha küçük gui uygulamaları için. Bu, denenmiş ve kanıtlanmış bir çerçeve olduğu için mükemmel olabilir.


salıncak

Daha önce belirtildiği gibi AWT'ye dayanmaktadır. Bebeklik döneminde yavaş ve buggy olarak kabul edildi ve IBM'in Eclipse için SWT oluşturmasına neden oldu. Ancak Java 5 (veya 6?) İle Swing, yeni uygulamalar oluşturmak için tercih edilen çerçeve haline geldi. Swing'in birçok zengin bileşeni var, ancak bazı bölgelerde hala eksik. Buna bir örnek, sıralama ve filtreleme / arama yapabilen tam özellikli bir TreeTable bileşeni olmamasıdır.


SWT

Eclipse için IBM tarafından oluşturulan Swing'in o zaman Eclipse için uygun olmadığını düşünüyorlardı. Kendi başına oldukça düşük seviyelidir ve platformun yerel widget'larını JNI aracılığıyla kullanır. Salıncak ve AWT ile hiç ilgili değil. Ancak API'leri biraz tıknaz ve sezgisel değil. TreeTable gibi bazı gelişmiş bileşenlere sahipler. (ama sıralama ve filtreleme kutunun dışında desteklediğini sanmıyorum). SWT bazı yerel bağlamalar kullanır (JNI? Yoluyla) ve internetteki rant, bu çerçevenin günümüz projelerinde kullanılmaması gerektiğidir. (neden olmasın?)


SwingX

Swing'e dayanıyor ve misyonu salıncak için zengin bileşenler yaratmak. Hala geliştirilme aşamasında. (çok aktif değil.) Çok güzel bir bileşen setiniz var, örneğin TreeTable gibi. Ancak TreeTable bildiğim kadarıyla filtreleme ve sıralamayı desteklemiyor. Ancak vurgulama ile aramayı destekler.

SwingX'in mevcut Swing bileşenlerinin uzantıları veya kompozisyonları olan bileşenler (AFAIU) olduğunu unutmayın


JGoodies

Hakkında hiçbir şey bilmediğim bir çerçeve ... Güçlü ve zayıf yanları nedir? Jgoodies'i diğerlerinden ayıran nedir?

JGoodies OTOH, PLAF'lar ve düzenler hakkındadır.


JavaFX

Java / Oracle'ın en yeni amiral gemisi. zengin masaüstü veya web uygulamaları geliştirmede fiili standart olmayı vaat ediyor.


Apache Pivot

Java2D kullanarak UI oluşturur, böylece (IMO, şişirilmiş) Swing ve AWT miraslarının etkisini en aza indirir. (@ErkekTerimleri)

Ana odak noktası RIA (Zengin internet uygulamaları) üzerindedir, ancak masaüstü uygulamalarına da uygulanabileceği görülmektedir. Ve kişisel bir yorum olarak, Çok ilginç görünüyor! Özellikle apache projesi gibi.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

C / c ++ ile yazılmış yerel qt kütüphanesine bir java sarmalayıcısı. Çok güçlü, yaygın olarak kullanılan ve kabul edilen. Çok sayıda GUI bileşeni ve kullanımı kolay bir API'ye sahiptir.

http://qt-jambi.org/


Yani, sorduğum şeylerin bir kısmını özetlemeye çalışmak için:

Diyelim ki bugün Java'da çok sayıda gelişmiş bileşen içeren bir masaüstü uygulaması oluşturmak istedim, ne seçmeliyim? Ve neden?

Bu çerçevelerden hangisi kullanımdan kaldırılmış ve hangisi uzak geleceğin çerçeveleri olarak tanınmalıdır?

Bugün fiili standart çerçevesi nedir ve java gui uygulamaları oluşturmak için hangi araçları kullanıyorsunuz?


Bunu sormaktan pişman olabilirim ama yine de deneyeceğim:

C # /. Net'in, mümkün olan her yöne bükülebilen çok iyi, kullanımı kolay bileşenler kümesine sahip olduğu söylenir. Ve bir ölçüde farklı java çerçevelerini araştırdıktan sonra Java hakkında aynı şeyi söyleyemem. Bu neden? Java (dünyada en yaygın kullanılan programlama dili olan) neden aynı GUI bileşenleri kümesine sahip değil?

Sadece java, gui bileşenlerini çok daha düşük bir seviyeye dayandırıyor mu ve aradığım tüm bu gelişmiş bileşenleri yazmak mümkün, ancak işin tamamı olmasa bile çok şey yapmanız gerekiyor mu?


SWT'nin "AWT ve Swing'in bir kombinasyonuna dayandığını" bilmiyordum. Durum gerçekten bu mu? İşletim sisteminin pencere sistemini çağırmanın saf JNI olduğunu düşündüm ...
Zengin

@ Zen Oh, cevap yorumlarından birinde söylendi. Ne hakkında konuştuklarını bildiklerini sanıyordum.
netbrain

4
Sanırım "UI Toolkit" ve "GUI framework" ü karıştırıyorsunuz. AWT, Swing ve SWT, UI araç takımlarıdır, ancak kesinlikle onlara "çerçeve" demezdim. Çerçeveler belirli bir kullanıcı arayüzü araç setini temel alır ve uygulamanızı oluşturmak için tutkal sağlar. İlk olarak, UI araç setini seçmeli ve daha sonra bu araç setinde çalışan bir çerçeve seçmelisiniz. FWIW, kendi ev yapımı Guts-GUI çerçevemle
Swing'i seçerim

1
Neredeyse her zaman Swing'e karşı SWT (en azından benim için), küçük karşılaştırma için deneyimli bir Java SWT programcısının Swing'e geçerken bilmesi gereken ana şeyler nelerdir? ..
Sorceror

2
JavaFX artık önizleme SDK'sının bir parçası değildir ve Üretim kullanımı için mevcuttur. lütfen bu yayını güncelleyin.

Yanıtlar:


79

Karar ağacı:

  1. Qt ve SWT gibi çerçevelerin yerel DLL'lere ihtiyacı vardır. Kendinize şunu sormalısınız: Gerekli tüm platformlar destekleniyor mu? Yerel DLL'leri uygulamanızla paketleyebilir misiniz?

    SWT için bunu nasıl yapacağınıza bakın .

    Burada bir seçeneğiniz varsa, SWT yerine Qt'yi tercih etmelisiniz. Qt, UI ve masaüstünü anlayan insanlar tarafından geliştirilirken, SWT, Eclipse'yi daha hızlı hale getirmek için zorunluluktan geliştirilmiştir. Java 1.4 için bir UI çerçevesinden çok bir performans yaması. JFace olmadan, birçok büyük UI bileşenini veya UI bileşenlerinin çok önemli özelliklerini (tablolara filtre uygulamak gibi) kaçırmazsınız.

    SWT'de ihtiyacınız olan bir özellik eksikse, çerçeve onu genişletmek için biraz düşmanca olur. Örneğin, içindeki herhangi bir sınıfı genişletemezsiniz (sınıflar nihai değildir, sadece paketi this.getClass()olmadığında istisnalar atar org.eclipse.swtve imzalandığı için bu pakete yeni sınıflar ekleyemezsiniz).

  2. Yerel, saf bir Java çözümüne ihtiyacınız varsa, bu sizi geri kalanı ile bırakır. AWT, Swing, SwingX - Swing yolu ile başlayalım.

    AWT modası geçmiş. Swing modası geçmiş (belki daha az ama son 10 yıldır Swing üzerinde çok fazla çalışma yapılmadı). Swing'in başlamak için iyi olduğunu iddia edebilirsiniz, ancak hepimiz kod çürüklerini biliyoruz. Ve bu özellikle bugün kullanıcı arayüzleri için geçerlidir.

    Bu sizi SwingX'e bırakıyor. Uzun bir yavaş ilerleme sürecinden sonra, gelişme tekrar artmıştır . Swing'in en büyük dezavantajı, 15 yıl önce çok kanayan ama bugün "sakar" hisseden bazı eski fikirlere dayanmasıdır. Örneğin, tablo görünümleri filtrelemeyi ve sıralamayı destekler, ancak yine de bunu yapılandırmanız gerekir. Modern hissettiren iyi bir kullanıcı arayüzü elde etmek için çok fazla kazan plakası kodu yazmanız gerekecek.

    Başka bir zayıf alan da tema. Bugün itibariyle birçok tema var. İlk 10 için buraya bakın . Ama bazıları yavaş, bazıları buggy, bazıları eksik. Bir kullanıcı arayüzü yazdığımda nefret ediyorum ve kullanıcılar garip bir tema seçtiklerinden onlar için bir şeylerin işe yaramadığından şikayet ediyorlar.

  3. JGoodies SwingX'in üstünde SwingX gibi başka bir katman. Swing'i kullanmayı daha keyifli hale getirmeye çalışır. Web sitesi harika görünüyor. Hadi öğreticiye bir göz atalım ... hm ... hala arıyor ... bekle. Web sitesinde hiç belge yok gibi görünüyor. Google kurtarmak için . Hayır, hiç faydalı ders yok.

    Belgeleri potansiyel yeni hayranlardan gizlemek için çok uğraşan bir kullanıcı arayüzü çerçevesinden emin değilim. Bu JGoodies'in kötü olduğu anlamına gelmez; Bu konuda söyleyecek iyi bir şey bulamadım ama güzel görünüyor.

  4. JavaFX. Harika, şık. Destek var ama bunun ciddi bir kullanıcı arayüzü çerçevesinden çok parlak bir oyuncak olduğunu hissediyorum. Bu duygu, ağaç masaları gibi karmaşık UI bileşenlerinin eksikliğinden kaynaklanır. HTML görüntülemek için webkit tabanlı bir bileşen vardır .

    Tanıtıldığında ilk düşüncem "beş yıl çok geç" oldu. Amacınız telefonlar veya web siteleri için iyi bir uygulama, iyi. Amacınız profesyonel masaüstü uygulamasıysa, ihtiyacınız olanı sağladığından emin olun.

  5. Eksen. Bunu ilk kez duydum. Temelde Java2D tabanlı yeni bir UI çerçevesi. Bu yüzden dün denedim. Salıncak yok, sadece küçük bir AWT ( new Font(...)).

    İlk izlenim güzel bir şeydi. Başlamanıza yardımcı olacak kapsamlı bir dokümantasyon var. Örneklerin çoğu , web sayfasında canlı demolarla birlikte gelir (Not: Web tarayıcınızda Java'nın etkinleştirilmiş olması gerekir; bu bir güvenlik riskidir ), böylece kodu ve ortaya çıkan uygulamayı yan yana görebilirsiniz.

    Deneyimlerime göre, kodlamaya dokümantasyondan daha fazla çaba harcanıyor. Pivot belgelerine bakarak koda çok fazla çaba harcanmış olmalı. Şu anda tarayıcınızda bazı örneklerin ( PIVOT-858 ) çalışmasını engelleyen bir hata olduğunu unutmayın.

    Pivot hakkındaki ikinci izlenim, kullanımının kolay olması. Bir sorunla karşılaştığımda, genellikle bir örneğe bakarak çabucak çözebilirdim. Yine de, her bir bileşenin desteklediği tüm stillerin bir referansı eksik.

    JavaFX'te olduğu gibi, bir ağaç tablosu bileşeni ( PIVOT-306 ) gibi bazı üst düzey bileşenleri eksik . Tablo görünümü ile tembel yükleme deneyin vermedi. Benim izlenimim, altta yatan model tembel yükleme kullanıyorsa, bu yeterli.

    Umut verici. Yapabiliyorsanız, bir deneyin.


Denenmiş Pivot demo "Mutfak lavabo", bazı gruplar açtıktan sonra bütün CPU yemek devam ediyor. Pivot tasarımı nedeniyle, o zaman kesinlikle projelerimde istemiyorum.
Görünen Ad

Sorunun kaynağını bulduğum anlaşılıyor ve sonraki sürümlerde düzeltildi: apache-pivot-users.399431.n3.nabble.com/…
Görünen Ad

2
JavaFX 8 (Java 8 ve üstü için) bir TreeTableView widget'ına sahiptir. Bununla birlikte, JavaFX 2.2 (Java 7 için) bunu içermez ve ayrıca standart hata ve bilgi dialgosundan yoksundur: bkz. Stackoverflow.com/a/12760202/105137 . Ayrıca ControlsFX widget kitaplığı yalnızca Java 8 için kullanılabilir: fxexperience.com/controlsfx
kostmo

12

Bunun tek başına oldukça düşük seviyelidir ve platformun yerel widget'larını JNI aracılığıyla kullanır. Salıncak ve AWT ile hiç ilgili değil. Eclipse IDE ve benzeri tüm Eclipse tabanlı Zengin İstemci Uygulamaları, Vuze BitTorrent istemcisi , SWT kullanılarak inşa edilir. Ayrıca, Eclipse eklentileri geliştiriyorsanız, genellikle SWT kullanırsınız. Neredeyse 5 yıldır Eclipse tabanlı uygulamalar ve eklentiler geliştiriyorum, bu yüzden açıkça önyargılıyım. Ancak, SWT ve JFace UI araç seti ile çalışma konusunda da geniş deneyime sahibim üzerine inşa edilmiş SWT . JFace'in çok zengin ve güçlü olduğunu gördüm; bazı durumlarda SWT'yi seçmenin ana nedeni bile olabilir. Çalışan bir kullanıcı arayüzünü IDE benzeri olduğu sürece (tablolar, ağaçlar, yerel denetimler vb. İle) oldukça hızlı bir şekilde kırmanızı sağlar. Tabii ki özel kontrollerinizi de entegre edebilirsiniz, ancak bu biraz çaba gerektirir.


Size göre, sütun sıralama ve filtreleme ile TreeTable gibi gelişmiş bir bileşen SWT + JFace ile büyük bir sorun olur mu?
netbrain

@netbrain: Bunu defalarca yaptım, JFace ile oldukça basit. "IDE benzeri" bir arayüzle kastettiğim budur, belki de en iyi kelime seçimi değildir.
Zsolt Török

9

Başka bir çerçeve önermek istiyorum: Apache Pivot http://pivot.apache.org/ .

Kısa bir süre denedim ve RIA (Zengin İnternet Uygulaması) ala Flash olarak sunabileceklerinden çok etkilendim .

Java2D kullanarak UI oluşturur, böylece (IMO, şişirilmiş) Swing ve AWT miraslarının etkisini en aza indirir.


1
Netbrain'in masaüstü uygulamaları hakkında sorduğu izlenimine kapıldım. DEA çerçeveleri için GWT ve Vaadin'i de göz önünde bulundurun. Bu çerçeveler, Java'da yazmanıza, derleme yapmanıza ve tüm yaygın web tarayıcılarında çok iyi çalışan JavaScript almanıza olanak tanır.
Costis Aivalis

masaüstü uygulamaları için pivot uygulanamıyor mu?
netbrain

Belki bir tanım meselesidir, ancak RIA çerçeveleri temel olarak tarayıcılarda çalışacak şekilde tasarlanmıştır.
Costis Aivalis

2
@netbrain: Evet, Pivot'u masaüstü uygulaması (JFrame) veya uygulama (JApplet) olarak çalıştırabilirsiniz.
Augustus Thoo

9

Swing + SwingX + Miglayout benim tercih ettiğim kombinasyon. Miglayout, Swings'in 200 farklı düzen yöneticisi algıladığından çok daha basit ve çok daha güçlü. Ayrıca, özellikle karmaşık mizanpajlar oluştururken kullanışlı olan mizanpajlarınızda "hata ayıklama" olanağı sağlar.


8

Başka bir seçenek Qt Jambi kullanmaktır . C ++ zahmetsizce neredeyse tüm Qt büyüklüğüne (birçok bileşen, iyi dokümantasyon, kullanımı kolay) sahiptir. 3-4 yıl önce küçük bir proje için kullandım, o zaman bile neredeyse olgunlaşmıştı.

Swing vs. Qt hakkındaki tartışmayı burada görmek isteyebilirsiniz .


5

Kişisel fikrim: NetBeans platformu ile birlikte Swing'e gidin.

Gelişmiş bileşenlere (NetBeans'in sunduğundan daha fazla) ihtiyacınız varsa, NetBeans platformu tamamen Swing'e dayandığından SwingX'i sorunsuz (veya JGoodies) olmadan kolayca entegre edebilirsiniz.

Temel UI çerçevesine dayanan iyi bir platform olmadan büyük bir masaüstü uygulaması (veya büyük olacak bir uygulama) başlatmazdım.

Diğer seçenek, Eclipse RCP ile birlikte SWT'dir, ancak "saf" Swing bileşenlerini böyle bir uygulamaya entegre etmek (imkansız olmasa da) daha zordur.

Öğrenme eğrisi NetBeans platformu için biraz dik (her ne kadar Eclipse için de geçerli olduğunu tahmin etsem de) ama etrafta tavsiye edebileceğim bazı iyi kitaplar var.


1
SwingX'in mevcut Swing bileşenlerinin uzantıları veya kompozisyonları olan bileşenler (AFAIU) olduğunu unutmayın. JGoodies OTOH, PLAF'lar ve düzenler hakkındadır. Ama dediğin gibi, ya Swing ile sorunsuz bir şekilde bütünleşecek.
Andrew Thompson

1
+1 Gelişiminizi Swing'e dayandırın. Swing, AWT'nin üzerine inşa edilmiştir ve tüm platformlarda aynı görünen ve davranan hafif bileşenler içerir, bu nedenle AWT bileşenlerini asla doğrudan kullanmamalısınız. Eğer toedter.com JCalendar gibi geliştirme GUI kolayca ekleyebilirsiniz mükemmel Fasulye çok sayıda var.
Costis Aivalis

1
PLAF ve mizanpaja ek olarak, JGoodies daha fazlasını sunar: fasulye bağlama (sunum modeli deseni için), doğrulama ve "JSR-296 benzeri" bir çerçeve (ticari olanı).
jfpoilpret

3

NetBeans'te yerleşik Swing Framework olarak JSR296 tabanlı Java Masaüstü Uygulaması'nı unuttun

AWT ve JavaFX hariç tüm tarif edilen çerçeveleriniz Swing'e dayanıyor, Swing ile başlayacaksanız, tüm bu Swing'ler (Tabanlı Çerçeveler) için anlayacaksınız (açıkça)

ATW, SWT (Eclipse), Java Masaüstü Uygulaması (Netbeans), SwingX, JGoodies

tüm orada çerçeveler (JGoodies hakkında daha fazla bir şey bilmiyorum) dahil. JavaFX uzun süredir ilerleme kaydetmedi, çok sayıda Swing Tabanlı Çerçeveler durduruldu, eğer olmasa da en yeni sürüm olmadan

sadece benim görüşüm - en iyisi SwingX, ancak Swing hakkında en derin bilgiye sahip olmak,

Swing Tabanlı Çerçevelere Bakın ve Hissedin


bunların bir kısmı AWT Bileşenleri, bir kısmı Swing JCompoentns, bir kısmı AWT ve Swing arasında uygulanan, erişilebilir ve devralma yöntemleriyle fark var, örneğin Swing JComponents doğrudan (API) doğrudan
AWT'den

JSR296 öldü. Artık "korunmamaktadır" ve desteği NetBeans'ten kaldırılmıştır. (Ve asla başlamak için gerçekten iyi bir çerçeve değildi)
a_horse_with_no_name

@a_horse_with_no_name sağda with same progressSWT, SwingX, yeni sahip, yeni maniers
mKorbel

1
IBM tarafından geliştirilen SWT, Swing'e dayanmaz, rakip bir teknolojidir. Swing AWT kullanır. JavaFX de Swing'e dayanmaz. Tamamen yeni bir çerçevedir. Bazıları onu Swing'in halefi olarak adlandırıyor, ancak bu savaşı çağırmak hala çok olgunlaşmamış. Şu anda aynı kararı veriyorum ve Swing adayım, sadece mevcut olan en olgun ama gerçekçi seçenek olduğu için.
Gordon

1
SwingX, Swing'in uzantılarıdır (bu yüzden Swing bilgisi gerektirir), aslında, SwingX'in bazı özellikleri Swing'in kendisine yuvarlanmıştır.
Gordon

3

Katıldığım masaüstü uygulamaları için Swing'den oldukça memnun kaldım. Ancak Swing hakkındaki görüşünüzü gelişmiş bileşenler sunmuyorum. Bu durumlarda yaptığım şey JIDE'a gitmek. Ücretsiz değil, ama pahalı da değil ve kemerinizin altında size çok daha fazla araç sunuyor. Özellikle, filtrelenebilir bir TreeTable sunarlar.


Bunu bildiğim iyi oldu! Bu yüzden JIDE, Swing'e dayalı kendi bileşenlerini yarattı ...
netbrain

Evet, JIDE ızgaraları, ağaçları, tabloları, grafikleri ve benzerlerini kapsayan çok az bileşen yaptı. Dediğim gibi, ücretsiz değil ama bu şeyleri kendiniz yapmak için gereken zaman göz önüne alındığında, zaten yapılmış bir şeyi kullanarak muhtemelen daha iyi. Dahası, anladığım kadarıyla, JIDE, açık kaynak projelerinin, web sitelerine bir bağlantı veya 'Hakkında' iletişim kutusundaki bir logo karşılığında bileşenlerini kullanmalarına izin verme konusunda esnektir.
sbrattla

3

Swing ile giderdim. Düzen için JGoodies form düzenini kullanırdım. Form Düzenindeki beyaz makaleyi incelemeye değer - http://www.jgoodies.com/freeware/forms/

Ayrıca büyük bir masaüstü uygulaması geliştirmeye başlayacaksanız, kesinlikle bir çerçeveye ihtiyacınız olacak. Diğerleri netbeans çerçevesine dikkat çekti. Çok sevmedim, şimdi şirketimde kullandığımız yeni bir tane yazdım. Sourceforge üzerine koydum, ama çok fazla belgelemek için zaman bulamadık. Koda göz atmak için link:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

Vitrin aslında nasıl basit bir oturum açma yapacağınızı göstermelidir ..

Herhangi bir sorunuz olursa bana yardımcı olabilirim.

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.