В чем разница между Swing и AWT?

Ответы:

235

AWT - это интерфейс Java к собственному системному графическому интерфейсу, который присутствует в вашей ОС. Это не будет работать одинаково на всех системах, хотя и пытается.

Swing - это более или менее чистый Java-интерфейс. Он использует AWT для создания окна операционной системы, а затем рисует изображения кнопок, меток, текста, флажков и т. Д. В этом окне и реагирует на все щелчки мышью, нажатия клавиш и т. Д., Решая для себя, что делать. вместо того, чтобы позволить операционной системе справиться с этим. Таким образом, Swing является на 100% портативным и одинаковым для всех платформ (хотя он имеет скины и имеет «подключаемый внешний вид», который может сделать его более или менее похожим на то, как будут выглядеть собственные окна и виджеты).

Это очень разные подходы к GUI-инструментам и имеют множество последствий. Полный ответ на ваш вопрос будет пытаться изучить все эти вопросы. :) Вот пара:

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

Поскольку AWT использует родные графические виджеты, ваша ОС знает о них и обрабатывает их размещение друг перед другом и т. Д., Тогда как виджеты Swing представляют собой бессмысленные пиксели в окне с точки зрения вашей ОС. Сам Swing управляет компоновкой и укладкой ваших виджетов. Смешивание AWT и Swing крайне не поддерживается и может привести к смешным результатам, таким как собственные кнопки, которые скрывают все остальное в диалоговом окне, в котором они находятся, потому что все остальное было создано с помощью Swing.

Поскольку Swing пытается сделать все возможное в Java, кроме очень необработанных графических подпрограмм, предоставляемых собственным окном графического интерфейса, это приводило к значительным потерям производительности по сравнению с AWT. Это, к сожалению, сделало Swing медленным, чтобы завоевать популярность. Однако за последние несколько лет это резко сократилось из-за более оптимизированных JVM, более быстрых машин и (я полагаю) оптимизации внутренних компонентов Swing. Сегодня приложение Swing может работать достаточно быстро, чтобы быть работоспособным или даже быстрым, и почти неотличимым от приложения, использующего нативные виджеты. Некоторые скажут, что это заняло слишком много времени, но большинство скажет, что оно того стоит.

Наконец, вы также можете попробовать SWT (GUI-инструментарий, используемый для Eclipse и альтернативу как AWT, так и Swing), который является своего рода возвращением к идее AWT о доступе к нативным виджетам через Java.

skiphoppy
источник
Хм ... выполнив довольно обширный Swing для нескольких платформ, я могу вам сказать, что на разных платформах он сильно отличается. Аналогичный? Конечно. Тем же? Ни за что.
Клет
1
Проблемы супертяжелого / легкого веса исчезнут с обновлением 12 для Java 6 (см. Java.dzone.com/news/a-farewell-heavyweightlightwei ).
Дэн Дайер
Вот это да. Я не могу поверить, что они могут это исправить, и я все еще не могу поверить, что смешивание легких и тяжелых компонентов когда-либо было бы желательно. Но невероятно, что они могут это исправить.
skiphoppy
Просто забудь об обоих. Посмотрите на WPF. :)
Alper Ozcetin
3
Вот официальная статья Java , подтверждающая , что смешивание фиксировано: oracle.com/technetwork/articles/java/...
user193130
35

Базовое отличие, о котором уже все упоминали, состоит в том, что один - это тяжелый вес, а другой - легкий вес . Позвольте мне объяснить, в основном, что термин «большой вес» означает, что когда вы используете компоненты awt, нативный код, используемый для получения компонента представления, генерируется операционной системой , поэтому внешний вид меняется с ОС на ОС. Где, как в компонентах Swing, JVM несет ответственность за создание представления для компонентов. Еще одно утверждение, которое я видел, заключается в том, что Swing основан на MVC, а AWT - нет.

В доступе отказано
источник
14
фактически Swing использует подход Model-Delegate, который получен из подхода MVC, где в представлении и контроллере объединяются для структуры делегата
Purushottam
15

Свинг против AWT . По сути, AWT появился первым и представляет собой набор тяжелых компонентов пользовательского интерфейса (то есть они являются обертками для объектов операционной системы), тогда как Swing построен на основе AWT с более богатым набором легких компонентов.

Любая серьезная работа с пользовательским интерфейсом Java выполняется в Swing, а не в AWT, который в основном использовался для апплетов.

Клетус
источник
1
Есть ли случаи, когда awt более полезно / рекомендуется использовать, чем swing?
Самикша
1
Раньше было актуально ... 10 лет назад.
Барт
@Pacerier он говорил о AWT, а не о SWT
11

Когда AWT может быть более полезным, чем Swing -

  • возможно, вы нацелены на более старую JVM или платформу, которая не поддерживает Swing. Раньше это действительно входило в игру, если вы строили апплеты - вы хотели нацелить наименьший общий знаменатель, чтобы людям не пришлось устанавливать более новый плагин Java. Я не уверен, какая текущая наиболее широко установленная версия плагина Java - это может отличаться сегодня.
  • некоторые люди предпочитают нативный внешний вид AWT скинам платформы Swing «не совсем там». (Существуют более качественные сторонние скины, чем у Swing). Многие люди предпочли использовать FileDialog от AWT, а не Swing с FileChooser, потому что он давал диалог с файлами платформы, к которому привыкло большинство людей, а не «странный» пользовательский Swing.
Nate
источник
2
Но для последнего мы также можем создать FileChooser, который в значительной степени похож на диалоговое окно файла Windows (но без автозаполнения) stackoverflow.com/q/17630055/2534090
JavaTechnical
9

Это различие между AWT и Swing связано с несколькими последствиями.

AWT - это тонкий слой кода поверх операционной системы, тогда как Swing намного больше. Swing также обладает гораздо более богатой функциональностью. Используя AWT, вы должны реализовать много вещей самостоятельно, в то время как Swing имеет их встроенные. Для работы с интенсивным графическим интерфейсом AWT чувствует себя очень примитивно для работы по сравнению с Swing. Поскольку Swing сам реализует функциональность GUI, а не полагается на хост-ОС, он может предложить более богатую среду на всех платформах, на которых работает Java. AWT более ограничен в предоставлении одинаковой функциональности на всех платформах, потому что не все платформы реализуют одинаковые элементы управления одинаковыми способами.

Компоненты Swing называются «легковесными», потому что им не требуется собственный объект ОС для реализации их функциональных возможностей. JDialogи JFrameв тяжелом весе, потому что у них есть сверстники. Таким образом, такие компоненты, как JButton, JTextAreaи т. Д., Являются легковесными, потому что они не имеют однорангового узла ОС.

Равный виджет , предоставляемые операционной системой, например, объект кнопки или объект поля ввода.

Сурендра Бхарадвадж
источник
7

Качели:

  1. Swing является частью базовых классов Java.
  2. Компоненты Swing не зависят от платформы.
  3. Компоненты Swing - это легкие компоненты, потому что Swing находится на вершине AWT

AWT:

  1. AWT называется инструментом абстрактного окна.
  2. Компоненты AWT зависят от платформы.
  3. Компоненты AWT - это тяжелые компоненты.
Дипика
источник
5
  • Компонент Swing обеспечивает гораздо более гибкий пользовательский интерфейс, поскольку он соответствует контроллеру модели (mvc).
  • AWT не основан на MVC.
  • качели работают быстрее.
  • AWT не работает быстрее.
  • Компоненты качания имеют малый вес.
  • Компоненты AWT имеют большой вес.
  • Свинг занимает меньше места в памяти.
  • AWT занимает больше места в памяти.
  • Качающийся компонент не зависит от платформы.
  • AWT зависит от платформы.
  • качели требуют пакет javax.swing.
  • AWT требуется пакет javax.awt.
арш
источник
10
Я не думаю, что Swing работает быстрее, чем AWT, потому что AWT использует собственный код (код GUI), который уже был в ОС, но Swing создает каждый компонент с нуля. Так что AWT может быть быстрее. Не могли бы вы сказать мне, что вы думаете о том, что свинг работает быстрее ? Спасибо.
JavaTechnical
3

AWT 1. AWT занимает больше места в памяти 2. AWT зависит от платформы 3. AWT требуется пакет javax.awt

качели 1. Качели занимают меньше места в памяти 2. Компонент Swing не зависит от платформы. 3. Swing требует пакет javax.swing

B.DastagiriReddy
источник
1
Не могли бы вы сказать мне, как AWT занимает больше места в памяти? Потому что он использует нативный код?
JavaTechnical
AWT требует java.awt. *
abhisekp