Framework Java GUI. Cosa scegliere? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [chiuso]


228

Esistono molti framework gui per java, ma cosa è riconosciuto come il framework di scelta di oggi?

Quanto segue è la mia comprensione dei diversi framework, per favore correggimi se sbaglio. Questa è una serie di domande molto vagamente definite, ma continuo a pensare che sia utile per chiunque stia pensando di creare applicazioni con interfaccia grafica.


AWT

È il vero fondamento dello swing, funziona bene ma manca di componenti avanzati. Se si intende creare applicazioni avanzate, AWT non è probabilmente la strada da percorrere. Tuttavia, per applicazioni con gui più piccole che non richiedono interfacce utente avanzate. Questo potrebbe adattarsi perfettamente in quanto è un framework collaudato.


Swing

Basato su AWT come precedentemente indicato. Nella sua infanzia è stato considerato lento e difettoso e ha portato IBM a creare SWT per Eclipse. Tuttavia con Java 5 (o 6?) Swing è diventato il framework di scelta per la creazione di nuove applicazioni. Swing ha molti componenti ricchi ma mancano ancora in alcune aree. Un esempio è che non esiste un componente TreeTable con funzionalità complete che può eseguire l'ordinamento e il filtro / la ricerca.


SWT

Creati da IBM per Eclipse, sembravano pensare che Swing non fosse adatto a Eclipse al momento. Di per sé è piuttosto di basso livello e utilizza i widget nativi della piattaforma tramite JNI. Non è affatto correlato a Swing e AWT. La loro API è tuttavia un po 'goffa e non intuitiva. Hanno alcuni componenti avanzati come una TreeTable. (ma non credo che supportino l'ordinamento e il filtraggio out of the box). SWT utilizza alcuni binding nativi (tramite JNI?) E su Internet si afferma che questo framework non dovrebbe essere utilizzato nei progetti di oggi. (perchè no?)


SwingX

Basato su Swing e la sua missione è creare componenti ricchi per lo swing. Ancora in fase di sviluppo. (non molto attivo però.) Avere un set di componenti molto bello, come ad esempio TreeTable. Ma TreeTable non supporta il filtraggio e l'ordinamento per quanto ne so. Tuttavia, supporta la ricerca con l'evidenziazione.

Si noti che SwingX sono componenti (AFAIU) che sono estensioni o composizioni di componenti Swing esistenti


JGoodies

Un framework di cui non so nulla ... Quali sono i suoi punti di forza e di debolezza? Che cosa distingue Jgoodies dal resto?

JGoodies OTOH riguarda PLAF e layout.


JavaFX

L'ultima ammiraglia di Java / Oracle. promettendo di essere lo standard di fatto nello sviluppo di ricche applicazioni desktop o web.


Apache Pivot

Esegue il rendering dell'interfaccia utente utilizzando Java2D, riducendo così al minimo l'impatto di eredità (IMO, gonfio) di Swing e AWT. (@Augustus Thoo)

Il suo focus principale sembra essere su RIA (Rich Internet Applications), ma sembra che possa essere applicato anche alle applicazioni desktop. E come commento personale, sembra molto interessante! Mi piace soprattutto che sia un progetto apache.

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


Qt Jambi

Un wrapper java per la libreria qt nativa che è scritta in c / c ++. Molto potente, ampiamente usato e accettato. Ha molti componenti della GUI e un'API facile da usare.

http://qt-jambi.org/


Quindi, per provare a riassumere un po 'di quello che ti sto chiedendo:

Supponiamo che oggi volessi creare un'applicazione desktop in Java che coinvolga molti componenti avanzati, cosa dovrei scegliere? E perché?

Quale di questi framework dovrebbe essere riconosciuto come deprecato e quale dovrebbe essere riconosciuto come framework di un futuro lontano?

Che cos'è l'attuale framework di fatto standard e quali strumenti utilizzate per creare applicazioni java gui?


Potrei pentirmi di averlo chiesto, ma provo comunque:

C # /. Si dice che Net abbia un ottimo set di componenti facili da usare che possono essere flessi in ogni direzione possibile. E dopo aver studiato in qualche modo diversi framework Java, non riesco a dire lo stesso di Java. Perchè è questo? Perché java (che è il linguaggio di programmazione più utilizzato al mondo) non ha lo stesso set di componenti della GUI?

È solo che Java ha basato i suoi componenti GUI a un livello molto più basso, ed è possibile scrivere tutti questi componenti avanzati che sto cercando, ma devi fare molto se non tutto il lavoro da solo?


Non sapevo che SWT fosse "basato su una combinazione di AWT e Swing". È davvero così? Pensavo fosse puro JNI invocare il sistema di finestre del sistema operativo ...
Rich

@Rich Oh, è stato detto in una delle risposte ai commenti. Pensavo solo che sapessero di cosa stavano parlando.
netbrain

4
Penso che confondi "UI Toolkit" e "GUI framework". AWT, Swing e SWT sono toolkit dell'interfaccia utente, ma non li definirei certamente "framework". I frame sono basati su un determinato toolkit dell'interfaccia utente e forniscono la colla per creare la tua applicazione. Innanzitutto, dovresti scegliere il toolkit dell'interfaccia utente e quindi scegliere un framework che funzioni su quel toolkit. FWIW, sceglierei Swing con il mio framework Guts-GUI fatto in casa :-)
jfpoilpret

1
È quasi sempre Swing vs. SWT (almeno per me), per un piccolo confronto potresti controllare Quali sono le cose principali di cui un programmatore Java SWT esperto dovrebbe essere consapevole quando si sposta su Swing? ..
Stregone,

2
JavaFX non fa più parte dell'anteprima SDK ed è disponibile per l'uso in produzione. si prega di aggiornare questo post.

Risposte:


79

Albero decisionale:

  1. Frame come Qt e SWT necessitano di DLL native. Quindi devi chiederti: sono supportate tutte le piattaforme necessarie? Puoi impacchettare le DLL native con la tua app?

    Vedi qui, come fare per SWT .

    Se hai una scelta qui, dovresti preferire Qt a SWT. Qt è stato sviluppato da persone che comprendono l'interfaccia utente e il desktop, mentre SWT è stato sviluppato per necessità per rendere più veloce Eclipse. È più una patch di prestazioni per Java 1.4 che un framework UI. Senza JFace, ti mancano molti importanti componenti dell'interfaccia utente o funzionalità molto importanti dei componenti dell'interfaccia utente (come il filtro sulle tabelle).

    Se a SWT manca una funzionalità di cui hai bisogno, il framework è alquanto ostile a estenderlo. Ad esempio, non è possibile estendere alcuna classe al suo interno (le classi non sono definitive, generano solo eccezioni quando il pacchetto di this.getClass()non è org.eclipse.swte non è possibile aggiungere nuove classi in quel pacchetto perché è firmato).

  2. Se hai bisogno di una soluzione nativa, pura Java, che ti lascia con il resto. Cominciamo con AWT, Swing, SwingX - il modo Swing.

    AWT è obsoleto. Swing è obsoleto (forse meno, ma non è stato fatto molto lavoro su Swing negli ultimi 10 anni). Si potrebbe obiettare che Swing era buono per cominciare, ma sappiamo tutti che il codice marcisce. E questo è particolarmente vero per le UI oggi.

    Questo ti lascia con SwingX. Dopo un lungo periodo di lenti progressi, lo sviluppo ha ripreso a crescere . Il principale svantaggio di Swing è che si aggrappa ad alcune vecchie idee che in qualche modo risalgono a 15 anni fa, ma che oggi sembrano "goffe". Ad esempio, le viste tabella supportano il filtraggio e l'ordinamento, ma è comunque necessario configurarlo. Dovrai scrivere un sacco di codice della piastra della caldaia solo per ottenere un'interfaccia utente decente che sembra moderna.

    Un'altra area debole è il tema. Ad oggi, ci sono molti temi in giro. Vedi qui per la top 10 . Ma alcuni sono lenti, altri sono buggy, altri sono incompleti. Lo odio quando scrivo un'interfaccia utente e gli utenti si lamentano che qualcosa non funziona per loro perché hanno selezionato un tema strano.

  3. JGoodies è un altro livello sopra Swing, come SwingX. Cerca di rendere Swing più piacevole da usare. Il sito web è fantastico. Diamo un'occhiata al tutorial ... hm ... ancora alla ricerca ... aspetta. Sembra che non ci sia alcuna documentazione sul sito web. Google in soccorso . No, nessun tutorial utile a tutti.

    Non mi sento fiducioso con un framework dell'interfaccia utente che si sforza così tanto di nascondere la documentazione ai potenziali nuovi fan. Ciò non significa che JGoodies sia cattivo; Non riuscivo a trovare niente di buono da dire al riguardo, ma che sembra carino.

  4. JavaFX. Fantastico, alla moda. Il supporto è lì, ma sento che è più un giocattolo luccicante che un serio framework dell'interfaccia utente. Questa sensazione affonda le radici nella mancanza di componenti dell'interfaccia utente complessi come le tabelle degli alberi. Esiste un componente basato su webkit per visualizzare HTML .

    Quando fu introdotto, il mio primo pensiero fu "cinque anni in ritardo". Se il tuo obiettivo è una bella app per telefoni o siti web, bene. Se il tuo obiettivo è un'applicazione desktop professionale, assicurati che offra ciò di cui hai bisogno.

  5. Perno. La prima volta che ne ho sentito parlare. È fondamentalmente un nuovo framework dell'interfaccia utente basato su Java2D. Quindi ho provato ieri. No Swing, solo un pochino di AWT ( new Font(...)).

    La mia prima impressione è stata buona. C'è una vasta documentazione che ti aiuta a iniziare. La maggior parte degli esempi viene fornita con demo live (Nota: è necessario che Java sia abilitato nel browser Web; questo è un rischio per la sicurezza ) nella pagina Web, in modo da poter vedere il codice e l'applicazione risultante fianco a fianco.

    Nella mia esperienza, più sforzo va nel codice che nella documentazione. Osservando i documenti Pivot, è stato necessario molto sforzo nel codice. Si noti che al momento esiste un bug che impedisce il funzionamento di alcuni degli esempi ( PIVOT-858 ) nel browser.

    La mia seconda impressione di Pivot è che è facile da usare. Quando ho riscontrato un problema, di solito potevo risolverlo rapidamente guardando un esempio. Mi manca un riferimento a tutti gli stili supportati da ciascun componente.

    Come con JavaFX, mancano alcuni componenti di livello superiore come un componente della tabella ad albero ( PIVOT-306 ). Non ho provato il caricamento lento con la vista tabella. La mia impressione è che se il modello sottostante utilizza un caricamento lento, è sufficiente.

    Promettente. Se puoi, provalo.


Ho provato la demo "Kitchen sink" di Pivot, dopo aver aperto alcuni gruppi continua a consumare tutta la CPU. Se è a causa del design Pivot, sicuramente non lo voglio nei miei progetti.
Visualizza nome

Sembra che ho trovato la fonte del problema ed è stato risolto nelle versioni successive: apache-pivot-users.399431.n3.nabble.com/…
Visualizza nome

2
JavaFX 8 (per Java 8 e versioni successive) ha un widget TreeTableView. Tuttavia, JavaFX 2.2 (per Java 7) manca di questa, e manca anche di errore e di informazioni dialgos standard: vedi stackoverflow.com/a/12760202/105137 . Anche la libreria dei widget ControlsFX è disponibile solo per Java 8: fxexperience.com/controlsfx
kostmo

12

SWT di per sé è piuttosto di basso livello e utilizza i widget nativi della piattaforma tramite JNI. Non è affatto correlato a Swing e AWT. L' IDE Eclipse e tutte le applicazioni Rich Client basate su Eclipse, come il client Vuze BitTorrent , sono realizzate utilizzando SWT. Inoltre, se stai sviluppando plugin Eclipse, in genere utilizzerai SWT.
Sto sviluppando applicazioni e plugin basati su Eclipse da quasi 5 anni, quindi sono chiaramente di parte. Tuttavia, ho anche una vasta esperienza nel lavoro con SWT e JFace UI toolkit, che è costruito su di esso. Ho trovato JFace molto ricco e potente; in alcuni casi potrebbe anche essere il motivo principale per la scelta di SWT. Ti consente di montare un'interfaccia utente funzionante abbastanza rapidamente, purché sia ​​simile all'IDE (con tabelle, alberi, controlli nativi, ecc.). Ovviamente puoi anche integrare i tuoi controlli personalizzati, ma questo richiede un ulteriore sforzo.


Secondo te, un componente avanzato come una TreeTable con ordinamento e filtro delle colonne sarebbe un grosso problema con SWT + JFace?
netbrain

@netbrain: l'ho fatto numerose volte, è abbastanza semplice con JFace. Questo è ciò che intendevo per interfaccia "simile a IDE", forse non la scelta migliore delle parole.
Zsolt Török,

9

Vorrei suggerire un altro framework: Apache Pivot http://pivot.apache.org/ .

Ho provato brevemente e sono rimasto colpito da ciò che può offrire come un quadro RIA (Rich Internet Application) ala Flash.

Esegue il rendering dell'interfaccia utente utilizzando Java2D, riducendo così al minimo l'impatto di eredità (IMO, gonfio) di Swing e AWT.


1
Ho avuto l'impressione che Netbrain chiedesse delle app desktop. Per i framework RIA, considerare anche GWT e Vaadin. Questi framework ti consentono di scrivere in Java, compilare e ottenere JavaScript che funziona molto bene su tutti i browser Web comuni.
Costis Aivalis,

pivot non può essere applicato per le applicazioni desktop?
netbrain

Forse è una questione di definizione, ma i framework RIA sono fondamentalmente progettati per essere eseguiti nei browser.
Costis Aivalis,

2
@netbrain: Sì, è possibile eseguire Pivot come app desktop (JFrame) o applet (JApplet).
Augusto Thoo,

9

Swing + SwingX + Miglayout è la mia combinazione di scelta. Miglayout è molto più semplice di quanto Swings abbia percepito 200 diversi gestori di layout e molto più potente. Inoltre, ti offre la possibilità di "eseguire il debug" dei tuoi layout, il che è particolarmente utile quando crei layout complessi.


8

Un'altra opzione è usare Qt Jambi . Ha quasi tutta la grandezza di Qt (molti componenti, buona documentazione, facile da usare), senza il fastidio di C ++. L'ho usato 3-4 anni fa per un piccolo progetto, anche se era quasi maturo.

Potresti voler vedere la discussione su Swing vs. Qt qui .


5

Il mio parere personale: scegli Swing insieme alla piattaforma NetBeans.

Se hai bisogno di componenti avanzati (oltre alle offerte di NetBeans) puoi facilmente integrare SwingX senza problemi (o JGoodies) poiché la piattaforma NetBeans è completamente basata su Swing.

Non vorrei avviare un'applicazione desktop di grandi dimensioni (o che sarà grande) senza una buona piattaforma che si basa sul framework dell'interfaccia utente sottostante.

L'altra opzione è SWT insieme a Eclipse RCP, ma è più difficile (anche se non impossibile) integrare componenti Swing "puri" in tale applicazione.

La curva di apprendimento è un po 'ripida per la piattaforma NetBeans (anche se immagino che sia vero anche per Eclipse) ma ci sono alcuni buoni libri intorno ai quali consiglio vivamente.


1
Si noti che SwingX sono componenti (AFAIU) che sono estensioni o composizioni di componenti Swing esistenti. JGoodies OTOH riguarda PLAF e layout. Ma come hai detto, o si integrerà perfettamente con Swing.
Andrew Thompson,

1
+1 Basa il tuo sviluppo su Swing. Swing è costruito su AWT e include componenti leggeri che sembrano e si comportano allo stesso modo su tutte le piattaforme, quindi non dovresti mai usare direttamente i componenti AWT. Esiste un gran numero di bean eccellenti che potresti facilmente aggiungere alla tua GUI di sviluppo come ie toedter.com JCalendar.
Costis Aivalis,

1
@Andrew oltre a PLAF e layout, JGoodies offre di più: rilegatura dei bean (per il modello del modello di presentazione), validazione e un framework "simile a JSR-296" (quello commerciale).
jfpoilpret,

3

ti sei dimenticato di Java Desktop Aplication basato su JSR296 come Swing Framework integrato in NetBeans

escludendo AWT e JavaFX, tutti i framework descritti sono basati su Swing, se inizierai con Swing, verrai compreso (chiaramente) per tutti questi Swing (Based Frameworks)

ATW, SWT (Eclipse), Java Desktop Aplication (Netbeans), SwingX, JGoodies

tutti i framework (non so qualcosa di più su JGoodies) incl. JavaFX non ha fatto progressi da molto tempo, molti dei Framework basati su Swing vengono arrestati, se non poi senza la versione più recente

solo il mio punto di vista: il migliore di questi è SwingX, ma è richiesta la più profonda conoscenza di Swing,

Aspetto per i frame basati su Swing


parte di essi su AWT Components, parte su Swing JCompoentns, ma tra AWT e Swing fa la differenza con i metodi implementati, accessibili ed ereditari, ad esempio Swing JComponents direttamente (API) implementa molti metodi ereditari o nidificati direttamente da AWT :-)
mKorbel

Il JSR296 è morto. Non viene più "mantenuto" e il supporto per esso è stato rimosso da NetBeans. (E non è mai stato un ottimo framework per iniziare)
a_horse_with_no_name

@a_horse_with_no_name che proprio with same progressin SWT, SwingX, nuovo proprietario, nuove maniers
mKorbel

1
SWT, sviluppato da IBM, non si basa su Swing, è / era una tecnologia concorrente. Swing utilizza AWT. JavaFX non si basa neanche su Swing. È un quadro completamente nuovo. Alcuni lo chiamano il successore di Swing, ma è ancora troppo immaturo per chiamare quella battaglia. Al momento sto prendendo la stessa identica decisione e Swing è il mio candidato, semplicemente per il fatto che è l'opzione più matura, ma realistica disponibile.
Gordon,

1
SwingX è un'estensione di Swing (motivo per cui richiede la conoscenza di Swing), infatti, alcune delle funzionalità di SwingX sono state implementate nello stesso Swing.
Gordon,

3

Sono stato abbastanza contento di Swing per le applicazioni desktop in cui sono stato coinvolto. Tuttavia, condivido la tua opinione su Swing che non offre componenti avanzati. Quello che ho fatto in questi casi è scegliere JIDE. Non è gratuito, ma nemmeno così costoso e ti offre molti più strumenti. In particolare, offrono una TreeTable filtrabile.


Buono a sapersi! Quindi JIDE ha creato i propri componenti basati su Swing ...
netbrain

Sì, JIDE ha realizzato alcuni componenti che coprono griglie, alberi, tabelle, grafici e simili. Come ho detto, non è gratuito, ma dato il tempo necessario per rendere queste cose te stesso probabilmente stai meglio usando qualcosa che è già stato creato. Inoltre, per quanto ho capito, JIDE è flessibile per quanto riguarda il fatto che i progetti open source possano utilizzare i loro componenti in cambio di un link al loro sito Web o di un logo nella finestra di dialogo "Informazioni".
sbrattla,

3

Vorrei andare con Swing. Per il layout userei il layout del modulo JGoodies. Vale la pena studiare qui il white paper sul layout del modulo - http://www.jgoodies.com/freeware/forms/

Inoltre, se inizierai a sviluppare un'enorme applicazione desktop, avrai sicuramente bisogno di un framework. Altri hanno sottolineato il quadro dei netbeans. Non mi è piaciuto molto, quindi ne ho scritto uno nuovo che ora utilizziamo nella mia azienda. L'ho messo su sourceforge, ma non ho trovato il tempo per documentarlo molto. Ecco il link per sfogliare il codice:

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

La vetrina dovrebbe mostrare come eseguire un semplice accesso in realtà.

Fammi sapere se hai qualche domanda al riguardo, posso aiutarti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.