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.