Каковы лучшие практики разработки Java Swing?

17

Проводя предварительное исследование этого вопроса , я обнаружил, что в Интернете не так много хорошо организованной информации о лучших практиках Java Swing. Так что я решил дать Stack Exchange шанс на создание этого Великого Списка.

Каковы лучшие практики разработки Java Swing? Что вы нашли для вас и почему?

попса
источник
2
Я играл с Swing в школе, и это был не очень приятный опыт. Все это казалось раздутым и излишне сложным. Лучшей практикой может быть использование чего-то другого.
Роберт Харви
1
@RobertHarvey, «играющий в школе», далек от предоставления производственного программного обеспечения. Я обнаружил, что Swing может сделать все, что от него требуется, разумным и логичным способом.
Ну, так сказать: если бы это было так сложно для простого школьного проекта, это было бы почти невообразимо трудно для реального.
Роберт Харви
1
@RobertHarvey Power приходит с ценой ...
Еще одна важная вещь. Компоненты Swing являются сериализуемыми и имеют много предков. Таким образом, они слишком тяжелы, чтобы наследовать в большинстве случаев. Вы должны рассмотреть некоторую технику обертывания, особенно когда у вас есть несериализуемое состояние. Если вы наследуете от компонента, просто используйте его как представление (в MVC или подобном шаблоне).
Давид Хорват

Ответы:

12

Я могу ответить только за то, что сработало для меня. Другие комментаторы отмечают, что графические интерфейсы Java в целом попадают в «сверхъестественную долину» не совсем родного внешнего вида, и я не оспариваю это.

Хорошо используйте Action API. Это позволяет вам лучше инкапсулировать различные действия, которые будет выполнять ваш пользователь, и позволит вам гораздо легче связывать их с ярлыками, клавишами ускорения, кнопками и другими объектами ввода.

Используйте соответствующий менеджер макета. GridBagLayout чрезвычайно мощен, но я бы сказал, что его невозможно поддерживать без чрезмерного количества комментариев. Когда я запускаю инструменты статического анализа кода, такие как Sonar, поверх старого приложения с графическим интерфейсом, которое я поддерживаю, оно всегда указывает на огромное количество магических чисел, чтобы сделать макет GridBags правильным. У меня был большой успех с GroupLayout, который избегает необходимости точного выравнивания пикселей.

Если вы думаете, что вам нужен JDialog ... вы, вероятно, нет. Диалоговые окна ужасны с точки зрения пользовательского опыта - это приложение решило использовать их для каждого меню и формы, а также для обеспечения соблюдения правил «всегда на вершине» причудливыми способами. Это превратилось в кошмар обслуживания, когда нам действительно нужно было что-то предупредить по меню. Cue расстроен нажатием на не фокусируемые - и, следовательно, неотделимые - диалоги.

Используйте SwingWorker вместо использования собственной многопоточности, где это уместно. Расширить SwingWorker очень просто и выполнить какую-то длительную задачу, регулярно предоставляя обновления графическому интерфейсу. Подумайте, загрузив обновление клиента. Он будет обрабатывать планирование рабочих потоков для вас и позволит вам публиковать проценты загрузки обратно в представление, чтобы вы могли обновить свой ProgressBar или что у вас есть.

Это все, что я могу предложить, по общему признанию своего ограниченного опыта.

Том Г
источник
2
JDialogпрекрасно - пока вы используете его для диалогов.
Джонас
1
Я согласен, что они в порядке, если вы используете их для информации, которую обязательно нужно увидеть - и действовать немедленно - немедленно. Но большая часть информации на самом деле не должна сильно мешать работе пользователя. Это была точка за моим отборочным.
Том Г
@Jonas Я думаю, дело в том, что диалоги - это плохо (независимо от того, реализованы они JDialogили нет).
Том Хотин - tackline
1
Соединение немного вонючее, но лучше IMO, чем писать свой собственный многопоточный код. Я предпочел бы иметь дело с не элегантным кодом, чем с тонкими ошибками потока.
Том Г
3
Вы можете посмотреть на MigLayout - miglayout.com
4

Я бы сказал, что одной из первых вещей является не работать над этим напрямую. Система компоновки в Swing (IMHO) ужасна, и попытка сделать из нее какое-либо существенное приложение - это кошмар.

Два из множества альтернативных менеджеров компоновки, которые я использовал, это макет MigLayout и MultiSplitPane. MigLayout более универсален и делает любой макет простым и вменяемым. MultiSplitPane является более конкретным; Я использовал его, чтобы сделать несколько простых макетов для GUI, которые не имели большой сложности.

РЕДАКТИРОВАТЬ : Это не заменяет качели . Если вам нужно использовать Swing, вы все равно можете использовать эти менеджеры раскладок, поскольку они управляют только Swing, а не заменяют его.


Конечно, лучшая альтернатива - просто не использовать Swing. Swing подвергается жесткой критике за то, что с ним ужасно работать, он не выглядит естественным и медленным. Существует множество альтернатив, которые научились на свинге тому, чего не следует делать, например, Qt, SWT, и я думаю, что даже GTK. Это отличные долгосрочные решения головной боли Swing

РЕДАКТИРОВАТЬ : Как сказал @Lord Torgamus, они не доступны, если вы вынуждены использовать Swing. Если вы собираетесь использовать их, лучше всего решить эту проблему при создании проекта, а не 3/4 или при выборе устаревших приложений.

Я также хотел бы отметить, что большинство альтернативных графических интерфейсов используют собственные библиотеки, чтобы они выглядели как операционная система, а затем вернулись к Swing или к другому графическому интерфейсу Pure Java.

TheLQ
источник
4
Я ценю ваше мнение, но «не используйте Swing» не помогает людям, которые задаются этим вопросом, потому что они вынуждены использовать Swing по тем или иным причинам.
появляется
@Lord Вот почему я предложил альтернативные менеджеры макетов, прежде чем предлагать QT и SWT. Используйте тот путь, который вы можете.
TheLQ
«Система компоновки в Swing (IMHO) ужасна, и попытка сделать из нее какое-либо существенное приложение - это кошмар». Менеджеры по макету, как правило, приходят из AWT, а не из Swing. Конечно, есть несколько специфичных для Swing, таких как BoxLayout и GroupLayout. Сказав это, менеджеры компоновки совершенно необязательны ... вместо этого вы можете указать координаты для каждого компонента, как вы делаете в .NET WinForms (за исключением того, что .NET имеет хороший графический интерфейс, чтобы сделать это для вас).
Powerlord
3
Посмотрите на MigLayout - miglayout.com
1
@TheLQ Хорошо, я согласен с файловым менеджером Swing, который действительно глуп (в Mac OS X тоже). В любом случае, я просто использую файловый менеджер AWT, чтобы это исправить. Работает хорошо, даже если остальная часть приложения сделана с использованием Swing.
Stommestack