Posso solo rispondere per ciò che ha funzionato per me. Altri commentatori hanno sottolineato che le GUI Java in generale cadono nella "valle misteriosa" di un aspetto non proprio nativo, e non ne discuto.
Fai buon uso dell'API di azione. Ti consente di incapsulare meglio le diverse azioni eseguite dall'utente e ti consente di collegarle a scorciatoie, tasti di scelta rapida, pulsanti e altri oggetti di input molto più facilmente .
Utilizza un gestore di layout appropriato. GridBagLayout è estremamente potente, ma direi che è impossibile da mantenere senza una quantità eccessiva di commenti. Quando eseguo strumenti di analisi del codice statici come Sonar su una vecchia GUI che mantengo, indica sempre le enormi quantità di numeri magici per rendere il layout di GridBar 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 no. Le finestre di dialogo sono orribili, in termini di esperienza utente: questa applicazione ha deciso di utilizzarle per ogni menu e modulo e di imporre regole sempre in primo piano in modi bizzarri. Questo si è trasformato in un incubo di manutenzione quando in realtà dovevamo avvisare qualcosa nel menu. Cue frustrato facendo clic su dialoghi non focalizzabili e quindi non eliminabili.
Usa SwingWorker invece di far ruotare il tuo multithreading, dove appropriato. È molto semplice estendere SwingWorker e svolgere alcune attività di lunga durata fornendo al contempo aggiornamenti regolari alla GUI. Pensa al download di un aggiornamento del client. Gestirà la pianificazione del thread di lavoro per te e ti consentirà di pubblicare percentuali di download per la visualizzazione, in modo da poter aggiornare ProgressBar o cosa hai.
Questo è tutto ciò che posso suggerire, nella mia esperienza dichiaratamente limitata.