Solo puedo responder por lo que funcionó para mí. Otros comentaristas han señalado que las GUI de Java en general caen en el 'valle misterioso' de la apariencia y sensación no nativas, y no lo niego.
Haz buen uso de la API de acción. Le permite encapsular mejor las diferentes acciones que realizará su usuario y le permite conectarlos a atajos, teclas de aceleración, botones y otros objetos de entrada con mucha más facilidad.
Use un administrador de diseño apropiado. GridBagLayout es extremadamente poderoso, pero iría tan lejos como para decir que es imposible de mantener sin una cantidad excesiva de comentarios. Cuando ejecuto herramientas de análisis de código estático como Sonar sobre una aplicación GUI anterior que mantengo, siempre señala las cantidades masivas de números mágicos para que el diseño de GridBags sea el correcto. He tenido mucho éxito con GroupLayout, que evita tener que especificar la alineación perfecta de píxeles.
Si crees que necesitas un JDialog ... probablemente no lo necesites . Los cuadros de diálogo son horribles, en términos de experiencia del usuario: esta aplicación decidió usarlos para cada menú y forma, y hacer cumplir las reglas siempre en la cima de maneras extrañas. Esto se convirtió en una pesadilla de mantenimiento cuando realmente necesitábamos alertar algo sobre el menú. Haga clic en los cuadros de diálogo no enfocados y, por lo tanto, imperdibles.
Use SwingWorker en lugar de rodar su propio subproceso múltiple, cuando corresponda. Es muy fácil extender SwingWorker y realizar tareas de larga duración mientras se proporcionan actualizaciones periódicas a la GUI. Piense en descargar una actualización del cliente. Se encargará de la programación de subprocesos de trabajo por usted y le permitirá publicar porcentajes de descarga de nuevo a la vista, para que pueda actualizar su ProgressBar o lo que sea.
Eso es todo lo que puedo sugerir, en mi experiencia ciertamente limitada.