Quali sono le migliori pratiche di sviluppo di Java Swing?


17

Durante la mia pre-ricerca per questa domanda , ho scoperto che non ci sono molte informazioni ben organizzate sulle migliori pratiche di Java Swing disponibili su Internet. Quindi immagino che darò una possibilità a Stack Exchange di costruire quella One Great List.

Quali sono le migliori pratiche di sviluppo di Java Swing? Cosa hai trovato di lavoro per te e perché?


2
Ho suonato con Swing a scuola e non è stata un'esperienza piacevole. Il tutto sembrava gonfio e inutilmente complesso. La migliore pratica potrebbe essere quella di utilizzare qualcos'altro.
Robert Harvey,

1
@RobertHarvey "giocare a scuola" è molto lontano dal fornire software di produzione. Ho scoperto che Swing può fare tutto ciò che era richiesto in modo ragionevole e logico.

Bene, mettiamola in questo modo: se fosse così difficile in un semplice progetto scolastico, sarebbe quasi inimmaginabilmente difficile in uno reale.
Robert Harvey,

1
Il potere di @RobertHarvey ha un prezzo ...

Solo un'altra cosa importante. I componenti dell'oscillazione sono serializzabili e hanno molti antenati. Quindi sono troppo pesanti per ereditare nella maggior parte dei casi. Dovresti prendere in considerazione alcune tecniche di wrapping, specialmente quando hai uno stato non serializzabile. Se erediti da un componente, basta usarlo come vista (in MVC o un modello simile).
Dávid Horváth,

Risposte:


12

Posso solo rispondere per quello che ha funzionato per me. Altri commentatori hanno sottolineato che le GUI Java in generale cadono nella "valle misteriosa" di aspetto e sensazione non del tutto autoctoni, e non lo discuto.

Fai buon uso dell'API di azione. Ti consente di incapsulare meglio le diverse azioni che l'utente eseguirà e di collegarle a scorciatoie, tasti di scelta rapida, pulsanti e altri oggetti di input molto più facilmente.

Utilizzare un gestore di layout appropriato. GridBagLayout è estremamente potente, ma direi che è irraggiungibile senza un'eccessiva quantità di commenti. Quando eseguo strumenti di analisi del codice statico come Sonar su un'app GUI precedente che mantengo, indica sempre le enormi quantità di numeri magici per rendere il layout GridBags giusto. Ho avuto molto successo con GroupLayout, che evita di dover specificare l'allineamento perfetto per i pixel.

Se pensi di aver bisogno di un JDialog ... probabilmente non lo fai. Le finestre di dialogo sono orribili, in termini di esperienza dell'utente: questa applicazione ha deciso di usarle per ogni menu e modulo e di imporre regole sempre al top in modi bizzarri. Questo si è trasformato in un incubo di manutenzione quando in realtà abbiamo avuto bisogno di avvisare qualcosa sul menu. Indizio frustrato facendo clic su dialoghi non focalizzabili - e quindi non credibili -.

Usa SwingWorker invece di creare il tuo multithreading, ove appropriato. È molto semplice estendere SwingWorker e svolgere alcune attività solitarie fornendo al contempo aggiornamenti regolari alla GUI. Prova a scaricare un aggiornamento client. Gestirà la pianificazione del thread di lavoro per te e ti consentirà di pubblicare le percentuali di download nella vista, in modo da poter aggiornare ProgressBar o quello che hai.

Questo è tutto ciò che posso suggerire, nella mia esperienza dichiaratamente limitata.


2
JDialogva benissimo - purché lo usi per le finestre di dialogo.
Jonas,

1
Sono d'accordo che vadano bene se le stai usando per informazioni che devono assolutamente essere viste - e su cui agire - immediatamente. Ma la maggior parte delle informazioni non ha davvero bisogno di disturbare così tanto l'esperienza dell'utente. Questo era il punto dietro il mio qualificatore.
Tom G,

@Jonas Penso che il punto sia che i dialoghi sono una cosa negativa (indipendentemente dal fatto che siano implementati JDialogo meno).
Tom Hawtin - tackline il

1
L'accoppiamento è un po 'puzzolente, ma è meglio IMO che scrivere il proprio codice di threading. Preferirei occuparmi del codice non elegante piuttosto che dei sottili bug del thread.
Tom G

3
Potresti voler visitare MigLayout - miglayout.com

4

Direi che una delle prime cose è non lavorarci direttamente. Il sistema di layout in Swing (IMHO) è terribile e cercare di realizzare qualsiasi app sostanziale è un incubo.

Due dei molti gestori di layout alternativi che ho usato sono il layout MigLayout e MultiSplitPane. MigLayout ha uno scopo più generale e rende qualsiasi layout a cui puoi pensare in modo facile e sano. MultiSplitPane è più specifico; L'ho usato per creare alcuni semplici layout per la GUI che non avevano molta complessità.

EDIT : questo non sostituisce swing . Se devi usare Swing puoi comunque usare questi gestori layout poiché gestiscono solo swing, non sostituirlo.


Ovviamente l'alternativa migliore è semplicemente non usare Swing. Swing è fortemente criticato per essere orribile con cui lavorare, non sembra nativo e lento. Esistono molte alternative che hanno imparato dallo swing cosa non fare come Qt, SWT e penso anche GTK. Queste sono grandi soluzioni a lungo termine per il mal di testa di Swing

EDIT : Come ha detto @Lord Torgamus, questi non sono realmente disponibili se sei costretto a usare Swing. Se hai intenzione di utilizzarli al meglio per risolverlo quando crei il tuo progetto, non i 3/4 sono in corso o quando raccogli le app legacy.

Vorrei anche notare che la maggior parte delle GUI alternative usano librerie native in modo da assomigliare al sistema operativo, quindi ricadere su Swing o su qualche altra GUI Pure Java.


4
Apprezzo la tua opinione, ma "non usare Swing" non è utile per le persone che finiscono con questa domanda perché sono costrette a usare Swing per un motivo o per l'altro.
apre il

@Lord Ecco perché ho suggerito gestori di layout alternativi prima di suggerire QT e SWT. Usa il percorso che puoi.
TheLQ

"Il sistema di layout di Swing (IMHO) è terribile e cercare di realizzare qualsiasi app sostanziale è un incubo." I gestori del layout tendono a venire da AWT, non da Swing. Concesso, ce ne sono alcuni specifici per Swing, come BoxLayout e GroupLayout. Detto questo, i gestori di layout sono completamente opzionali ... puoi invece specificare le coordinate per ciascun componente proprio come fai in .NET WinForms (tranne .NET ha una bella GUI per farlo per te).
Powerlord,

3
Dai un'occhiata a MigLayout - miglayout.com

1
@TheLQ Ok, sono d'accordo sul file manager di Swing, che è davvero stupido (anche su Mac OS X). Ad ogni modo, uso semplicemente il file manager di AWT per risolvere il problema. Funziona bene anche se il resto dell'applicazione è realizzato utilizzando Swing.
Stommestack
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.