Я могу ответить только за то, что сработало для меня. Другие комментаторы отмечают, что графические интерфейсы Java в целом попадают в «сверхъестественную долину» не совсем родного внешнего вида, и я не оспариваю это.
Хорошо используйте Action API. Это позволяет вам лучше инкапсулировать различные действия, которые будет выполнять ваш пользователь, и позволит вам гораздо легче связывать их с ярлыками, клавишами ускорения, кнопками и другими объектами ввода.
Используйте соответствующий менеджер макета. GridBagLayout чрезвычайно мощен, но я бы сказал, что его невозможно поддерживать без чрезмерного количества комментариев. Когда я запускаю инструменты статического анализа кода, такие как Sonar, поверх старого приложения с графическим интерфейсом, которое я поддерживаю, оно всегда указывает на огромное количество магических чисел, чтобы сделать макет GridBags правильным. У меня был большой успех с GroupLayout, который избегает необходимости точного выравнивания пикселей.
Если вы думаете, что вам нужен JDialog ... вы, вероятно, нет. Диалоговые окна ужасны с точки зрения пользовательского опыта - это приложение решило использовать их для каждого меню и формы, а также для обеспечения соблюдения правил «всегда на вершине» причудливыми способами. Это превратилось в кошмар обслуживания, когда нам действительно нужно было что-то предупредить по меню. Cue расстроен нажатием на не фокусируемые - и, следовательно, неотделимые - диалоги.
Используйте SwingWorker вместо использования собственной многопоточности, где это уместно. Расширить SwingWorker очень просто и выполнить какую-то длительную задачу, регулярно предоставляя обновления графическому интерфейсу. Подумайте, загрузив обновление клиента. Он будет обрабатывать планирование рабочих потоков для вас и позволит вам публиковать проценты загрузки обратно в представление, чтобы вы могли обновить свой ProgressBar или что у вас есть.
Это все, что я могу предложить, по общему признанию своего ограниченного опыта.