Фреймворки Java GUI. Что выбрать? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [закрыто]

228

Для Java достаточно много фреймворков с графическим интерфейсом, но что считается сегодняшним фреймворком?

Следующее - мое понимание различных структур, пожалуйста, поправьте меня, если я неправ. Это очень неопределенный набор вопросов, но я все еще считаю его ценным для всех, кто задумывается о создании приложений с богатым графическим интерфейсом.


AWT

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


свинг

На основе AWT, как указано выше. В зачаточном состоянии он считался медленным и глючным и заставил IBM создать SWT для Eclipse. Однако с Java 5 (или 6?) Swing стал предпочтительной средой для создания новых приложений. В Swing много богатых компонентов, но в некоторых областях их все еще не хватает. Одним из примеров является то, что не существует полнофункционального компонента TreeTable, который может выполнять сортировку и фильтрацию / поиск.


SWT

Созданные IBM для Eclipse, они, казалось, думали, что Swing тогда не подходил для Eclipse. Сам по себе довольно низкоуровневый, и использует родные виджеты платформы через JNI. Это никак не связано с Swing и AWT. Однако их API несколько неуклюжий и не интуитивно понятный. У них есть некоторые продвинутые компоненты, такие как TreeTable. (но я не думаю, что они поддерживают сортировку и фильтрацию из коробки). SWT использует некоторые нативные привязки (через JNI?), И в интернете часто говорят о том, что эта платформа не должна использоваться в сегодняшних проектах. (почему нет?)


SwingX

Основан на Swing и его миссия - создавать богатые компоненты для свинга. Все еще в разработке. (хотя и не очень активно.) Имеет очень хороший набор компонентов, например, TreeTable. Но TreeTable не поддерживает фильтрацию и сортировку, насколько я знаю. Тем не менее, он поддерживает поиск с подсветкой.

Обратите внимание, что SwingX - это компоненты (AFAIU), которые являются расширениями или композициями существующих компонентов Swing.


JGoodies

Фреймворк, о котором я ничего не знаю ... Каковы его сильные и слабые стороны? Какой набор Jgoodies помимо остальных?

JGoodies OTOH о PLAF и макетах.


JavaFX

Последний флагман Java / Oracle. обещает быть стандартом факто в разработке многофункциональных настольных или веб-приложений.


Apache Pivot

Он отображает пользовательский интерфейс с использованием Java2D, таким образом сводя к минимуму влияние (IMO, раздутый) наследий Swing и AWT. (@Augustus Thoo)

Кажется, что основное внимание уделяется RIA (многофункциональным интернет-приложениям), но, похоже, его можно применять и к настольным приложениям. И как личный комментарий, выглядит очень интересно! Особенно мне нравится, что это проект Apache.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Оболочка Java для нативной библиотеки qt, написанной на c / c ++. Очень мощный, широко используемый и принятый. Имеет множество компонентов GUI и простой в использовании API.

http://qt-jambi.org/


Итак, чтобы попытаться обобщить немного того, что я спрашиваю:

Скажем, я хотел сегодня создать настольное приложение на Java, которое включает в себя множество продвинутых компонентов, что мне выбрать? И почему?

Какую из этих рамок следует признать устаревшей, а какую - за далекое будущее?

Что сегодня является де-факто-стандартной платформой и какие инструменты вы используете для создания приложений на Java?


Я мог бы сожалеть, что спросил это, но я все равно попробую:

Говорят, что C # / .Net имеет очень хороший набор простых в использовании компонентов, которые можно сгибать в любом направлении. И после некоторого изучения различных Java-фреймворков я не могу сказать то же самое о Java. Почему это? Почему java (самый распространенный язык программирования в мире) не имеет такого же набора компонентов GUI?

Просто java основал свои компоненты графического интерфейса на гораздо более низком уровне, и можно написать все эти сложные компоненты, которые я ищу, но вам придется много, если не всю работу делать самостоятельно?

нетбрейн
источник
Я не знал, что SWT «основан на комбинации AWT и Swing». Это действительно так? Я думал, что это был чистый JNI, чтобы вызвать оконную систему ОС ...
Rich
@Rich О, это было сказано в одном из комментариев ответов. Я просто предположил, что они знали, о чем говорили.
мозг
4
Я думаю, что вы путаете "UI Toolkit" и "GUI Framework". AWT, Swing и SWT являются инструментарием пользовательского интерфейса, но я бы, конечно, не назвал их «фреймворками». Фреймворки основаны на определенном наборе инструментов пользовательского интерфейса и предоставляют клей для создания вашего приложения. Сначала вы должны выбрать инструментарий пользовательского интерфейса, а затем выбрать фреймворк, который работает с этим инструментарием. FWIW, я бы выбрал Swing с моей собственной самодельной структурой Guts-GUI :-)
jfpoilpret
1
Это почти всегда Swing против SWT (для меня, по крайней мере), для небольшого сравнения вы можете проверить, что нужно знать опытному программисту на Java SWT при переходе на Swing? ..
Колдун
2
JavaFX больше не является частью SDK для предварительного просмотра и доступен для использования в производственной среде. пожалуйста, обновите этот пост.

Ответы:

79

Древо решений:

  1. Каркасам, таким как Qt и SWT, нужны собственные библиотеки DLL. Поэтому вы должны спросить себя: все ли необходимые платформы поддерживаются? Можете ли вы упаковать нативные библиотеки DLL в свое приложение?

    Смотрите здесь, как это сделать для SWT .

    Если у вас есть выбор, вы должны предпочесть Qt, а не SWT. Qt был разработан людьми, которые понимают UI и рабочий стол, в то время как SWT был разработан из-за необходимости ускорить Eclipse. Это скорее исправление производительности для Java 1.4, чем среда пользовательского интерфейса. Без JFace вам не хватает многих основных компонентов пользовательского интерфейса или очень важных функций компонентов пользовательского интерфейса (например, фильтрация по таблицам).

    Если в SWT отсутствует нужная вам функция, фреймворк несколько враждебен ее расширению. Например, вы не можете расширить ни один класс в нем (классы не являются окончательными, они просто генерируют исключения, когда пакет this.getClass()не является, org.eclipse.swtи вы не можете добавлять новые классы в этот пакет, потому что он подписан).

  2. Если вам нужно нативное, чистое Java-решение, оно оставит вас в покое. Начнем с AWT, Swing, SwingX - способа Swing.

    AWT устарел. Swing устарел (возможно, меньше, но за последние 10 лет над Swing не было проделано большой работы). Можно утверждать, что Swing был хорош для начала, но мы все знаем, что код гниет. И это особенно актуально для пользовательских интерфейсов сегодня.

    Это оставляет вас с SwingX. После более длительного периода медленного прогресса развитие возобновилось . Основной недостаток Swing заключается в том, что он опирается на некоторые старые идеи, которые очень быстро развиваются 15 лет назад, но которые сегодня кажутся «неуклюжими». Например, табличные представления поддерживают фильтрацию и сортировку, но вам все равно нужно это настроить. Вам придется написать много кода, чтобы получить достойный интерфейс, который выглядит современно.

    Еще одним слабым местом является тема. На сегодняшний день вокруг много тем. Смотрите здесь для топ-10 . Но некоторые медленные, некоторые глючные, некоторые неполные. Я ненавижу, когда пишу пользовательский интерфейс, и пользователи жалуются, что у них что-то не работает, потому что они выбрали нечетную тему.

  3. JGoodies - это еще один слой поверх Swing, такой как SwingX. Он пытается сделать Swing более приятным в использовании. Веб-сайт выглядит великолепно. Давайте посмотрим на учебник ... хм ... все еще в поисках ... держись. Кажется, что на сайте вообще нет документации. Гугл на помощь . Нет, никаких полезных уроков вообще нет.

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

  4. JavaFX. Отлично, стильно. Поддержка есть, но я чувствую, что это скорее блестящая игрушка, чем серьезная структура пользовательского интерфейса. Это чувство коренится в отсутствии сложных компонентов пользовательского интерфейса, таких как древовидные таблицы. Существует компонент на основе webkit для отображения HTML .

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

  5. Pivot. Впервые слышу об этом. Это в основном новый пользовательский интерфейс, основанный на Java2D. Так что я попробовал вчера. Нет Swing, просто чуть-чуть AWT ( new Font(...)).

    Мое первое впечатление было приятным. Существует обширная документация, которая поможет вам начать работу. Большинство примеров поставляются с живыми демонстрациями (Примечание: у вас должна быть включена Java в вашем веб-браузере; это угроза безопасности ) на веб-странице, чтобы вы могли видеть код и получающееся приложение рядом.

    По моему опыту, в коде больше усилий, чем в документации. Глядя на документы Pivot, нужно было приложить немало усилий для написания кода. Обратите внимание, что в настоящее время существует ошибка, которая препятствует работе некоторых примеров ( PIVOT-858 ) в вашем браузере.

    Мое второе впечатление от Pivot - это то, что им легко пользоваться. Когда я сталкивался с проблемой, я обычно мог решить ее быстро, посмотрев на пример. Мне не хватает ссылки на все стили, которые поддерживает каждый компонент.

    Как и в JavaFX, в нем отсутствуют некоторые компоненты более высокого уровня, такие как компонент древовидной таблицы ( PIVOT-306 ). Я не пробовал ленивую загрузку с представлением таблицы. У меня сложилось впечатление, что если базовая модель использует ленивую загрузку, то этого достаточно.

    Перспективный. Если можешь, попробуй.

Аарон Дигулла
источник
Попробовал демо Pivot "Кухонная мойка", после открытия некоторых групп он продолжает кушать весь процессор. Если это из-за дизайна Pivot, то я определенно не хочу этого в своих проектах.
Отображаемое имя
Похоже, я нашел источник проблемы, и она была исправлена ​​в более поздних версиях: apache-pivot-users.399431.n3.nabble.com/…
Отображаемое имя
2
JavaFX 8 (для Java 8 и выше) имеет виджет TreeTableView. Тем не менее, JavaFX 2.2 (для Java 7) не хватает этого, а также не хватает стандартных ошибок и информация dialgos: см stackoverflow.com/a/12760202/105137 . Также библиотека виджетов ControlsFX доступна только для Java 8: fxexperience.com/controlsfx
kostmo
12

SWT сам по себе довольно низкоуровневый и использует родные виджеты платформы через JNI. Это никак не связано с Swing и AWT. Среда Eclipse IDE и все приложения Rich Client на основе Eclipse, такие как клиент Vuze BitTorrent , создаются с использованием SWT. Кроме того, если вы разрабатываете плагины Eclipse, вы обычно будете использовать SWT.
Я занимаюсь разработкой приложений и плагинов на основе Eclipse уже почти 5 лет, поэтому я явно предвзят. Тем не менее, у меня также есть большой опыт работы с SWT и инструментарием JFace UI, который построен поверх него. Я нашел JFace очень богатым и мощным; в некоторых случаях это может быть даже основной причиной выбора SWT. Он позволяет довольно быстро создавать рабочий интерфейс, если он похож на IDE (с таблицами, деревьями, встроенными элементами управления и т. Д.). Конечно, вы также можете интегрировать свои собственные элементы управления, но это требует дополнительных усилий.

Жолт Тёрёк
источник
По вашему мнению, такой сложный компонент, как TreeTable с сортировкой и фильтрацией столбцов, будет большой проблемой с SWT + JFace?
мозг
@netbrain: я делал это много раз, с JFace это довольно просто. Это то, что я имел в виду под «IDE-подобным» интерфейсом, возможно, не лучшим выбором слов.
Жолт Тёрёк
9

Я хотел бы предложить другую структуру: Apache Pivot http://pivot.apache.org/ .

Я попробовал его на короткое время, и был поражен тем , что он может предложить в качестве основы RIA (Rich Internet Application) ала Flash.

Он отображает пользовательский интерфейс с использованием Java2D, таким образом сводя к минимуму влияние (IMO, раздутый) наследий Swing и AWT.

Август Тоо
источник
1
У меня сложилось впечатление, что netbrain спрашивает о настольных приложениях. Для структур RIA, рассмотрим также GWT и Vaadin. Эти фреймворки позволяют писать на Java, компилировать и получать JavaScript, который очень хорошо работает во всех распространенных веб-браузерах.
Костис Айвалис
нельзя применить Pivot для настольных приложений?
мозга
Может быть, это вопрос определения, но платформы RIA в основном предназначены для работы в браузерах.
Костис Айвалис
2
@netbrain: Да, вы можете запускать Pivot как настольное приложение (JFrame) или апплет (JApplet).
Август Тоо
9

Swing + SwingX + Miglayout - моя комбинация выбора. Miglayout намного проще, чем Swings воспринимает 200 различных менеджеров компоновки и гораздо более мощный. Кроме того, он предоставляет вам возможность «отладки» ваших макетов, что особенно удобно при создании сложных макетов.

helpermethod
источник
8

Другой вариант - использовать Qt Jambi . Он обладает почти всем великолепием Qt (много компонентов, хорошая документация, простота в использовании), без хлопот с C ++. Я использовал его 3-4 года назад для небольшого проекта, даже тогда он был почти зрелым.

Возможно, вы захотите увидеть обсуждение Swing vs. Qt здесь .

nimcap
источник
5

Мое личное мнение: пойти на Swing вместе с платформой NetBeans.

Если вам нужны расширенные компоненты (больше, чем предлагает NetBeans), вы можете легко интегрировать SwingX без проблем (или JGoodies), поскольку платформа NetBeans полностью основана на Swing.

Я бы не стал запускать большое настольное приложение (или большое) без хорошей платформы, основанной на базовой структуре пользовательского интерфейса.

Другим вариантом является SWT вместе с Eclipse RCP, но сложнее (хотя и не невозможно) интегрировать «чистые» компоненты Swing в такое приложение.

Кривая обучения немного крутая для платформы NetBeans (хотя я полагаю, что это верно и для Eclipse), но есть несколько хороших книг, которые я очень рекомендую.

a_horse_with_no_name
источник
1
Обратите внимание, что SwingX - это компоненты (AFAIU), которые являются расширениями или композициями существующих компонентов Swing. JGoodies OTOH о PLAF и макетах. Но, как вы сказали, любой из них будет легко интегрироваться с Swing.
Эндрю Томпсон
1
+1 Основывайте свои разработки на Swing. Swing построен на основе AWT и включает в себя легкие компоненты, которые выглядят и ведут себя одинаково на всех платформах, поэтому вам никогда не придется использовать компоненты AWT напрямую. Существует большое количество отличных Бинов, которые вы можете легко добавить в свой графический интерфейс разработки, например, toedter.com JCalendar.
Костис Айвалис
1
@ В дополнение к PLAF и компоновке, JGoodies предлагает больше: привязку bean-компонентов (для шаблона модели презентации), валидацию и "JSR-296-подобный" фреймворк (коммерческий).
jfpoilpret
3

вы забыли для Java Desktop Aplication на основе JSR296 как встроенную среду Swing Framework в NetBeans

исключая AWT и JavaFX, все ваши описанные фреймворки основаны на Swing, если вы начнете с Swing, то вы будете (ясно) понимать все эти Swing (Based Frameworks)

ATW, SWT (Eclipse), Java-приложение для настольных компьютеров (NetBeans), SwingX, JGoodies

все там фреймворки (я не знаю больше о JGoodies) вкл. У JavaFX нет долгого прогресса, многие фреймворки на базе Swing остановлены, если не без последней версии

только мое мнение - лучший из них - SwingX, но требует глубоких знаний о Swing,

Look and Feel для основанных на Swing фреймворков

mKorbel
источник
часть из них в компонентах AWT, часть в Swing JCompoentns, но между AWT и Swing есть разница с реализованными, доступными и наследуемыми методами, например, Swing JComponents напрямую (API) реализует множество наследуемых или вложенных методов непосредственно из AWT :-)
mKorbel
JSR296 мертв. Он больше не поддерживается, и его поддержка удалена из NetBeans. (И это никогда не было действительно хорошей основой для начала)
a_horse_with_no_name
@a_horse_with_no_name прямо with same progressв SWT, SwingX, новый владелец, новые манеры
mKorbel
1
SWT, разработанный IBM, не основан на Swing, это / была конкурирующая технология. Swing использует AWT. JavaFX также не основан на Swing. Это совершенно новая структура. Некоторые называют это преемником Swing, но все еще слишком незрелым, чтобы называть это сражение. В настоящее время я принимаю точно такое же решение, и Swing - мой кандидат, просто потому, что это самый зрелый, но реалистичный вариант.
Гордон
1
SwingX является расширением Swing (поэтому он требует знания Swing), фактически некоторые функции SwingX были включены в сам Swing.
Гордон
3

Я был очень доволен Swing для настольных приложений, в которых я принимал участие. Однако я разделяю ваше мнение о том, что Swing не предлагает продвинутые компоненты. То, что я сделал в этих случаях, это пойти на JIDE. Это не бесплатно, но и не так дорого, и дает вам гораздо больше инструментов под вашим поясом. В частности, они предлагают фильтруемую TreeTable.

sbrattla
источник
Хорошо знать! Так что JIDE создал свои собственные компоненты на основе Swing ...
netbrain
Да, JIDE создал довольно много компонентов, охватывающих сетки, деревья, таблицы, графики и тому подобное. Как я уже сказал, это не бесплатно, но учитывая время, необходимое для того, чтобы сделать эти вещи своими руками, вам, вероятно, лучше использовать то, что уже сделано. Кроме того, насколько я понимаю, JIDE обладает гибкостью в отношении того, чтобы позволить проектам с открытым исходным кодом использовать свои компоненты в обмен на ссылку на свой веб-сайт или логотип в диалоге «О программе».
сбраттла
3

Я бы пошел с Swing. Для макета я бы использовал макет формы JGoodies. Здесь стоит изучить официальный документ по макету формы здесь - http://www.jgoodies.com/freeware/forms/

Также, если вы собираетесь начать разработку огромного настольного приложения, вам определенно понадобится фреймворк. Другие указали на структуру NetBeans. Мне это не очень понравилось, поэтому я написал новый, который мы сейчас используем в моей компании. Я поместил это в sourceforge, но не нашел времени, чтобы документировать это. Вот ссылка для просмотра кода:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

Витрина должна показать вам, как на самом деле сделать простой вход в систему ..

Дайте мне знать, если у вас есть какие-либо вопросы, я могу помочь.

Sethu
источник