Как стать автором
Обновить

Комментарии 54

Хорошая статья, но как-то не привычно читать "фреймуорк" и "лукэндфил". =)
Нда. Согласен. Это я видимо погорячился. Поправил. Спасиб за замечание.
Слово "фреймворк" в русском переводе часто называют "каркасом". ;)
Верно. Ещё можно обозвать скелетом. Скелет "Подпорка". Скелет "Пружина". Скелет "Качели". :-)
НЛО прилетело и опубликовало эту надпись здесь
Да, да, да. Плюсики не могу ставить, но я обеими руками - за!
Да, да, да. Плюсики тоже не могу ставить, но и я обеими руками - за!
Уж очень редко тут про Java что-то интересное попадается.
Добавлю, что начиная с Java 5 (или 6?) Swing тоже использует системные контролы. А Look&Feel для Mac OS X поддерживается самим Apple Inc.
На сколько я помню, чтобы обычное SWING приложение было более яблочным, нужно было использовать пакеты от Apple. Как минимум для работы с "яблочным" меню.
В макоси: нетбинс на свинге выглядит убого, еклипс на свт - круто
А в нем Look&Feel не выбираются. Если б можно было задать - было бы круто. Жыырный минус именно NetBeans лично для меня.

...да, кстати, идею на маке видели? Вот где круто. А свт... так себе.
идея платная по этому даже смотреть не буду)
По-моему, ничем невыдающееся эклипса.
В NetBeans Look&Feel среды задаётся в конфигурационном файле .netbeans/etc/netbeans.conf
Например, для Gtk-темы:
netbeans_default_options="-J-client -J-Xss4m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true --laf com.sun.java.swing.plaf.gtk.GTKLookAndFeel -J-Dfile.encoding=UTF-8"

Пример того, чтобы NetBeans выглядела со старой темой Swing Metal (вместо Swing Ocean):
netbeans_default_options="-J-client -J-Xss4m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dswing.metalTheme=steel -J-Dfile.encoding=UTF-8"

Также, любую программу на Swing, если в ней не задан Look&Feel можно запустить с нужной кожей, указав в команде запуска java класс лука:
> cd /usr/local/jdk1.6.0/demo/jfc/Java2D/
> java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -jar Java2Demo.jar
- будет интерфейс как у других Gtk-компонентов (не работает в Windows).

Ещё:
> cd /usr/local/jdk1.6.0/demo/jfc/Java2D/
> java -Dswing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel -jar Java2Demo.jar
- будет интерфейс Motif.

Для Windows:
> cd /usr/local/jdk1.6.0/demo/jfc/Java2D/
> java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel -jar Java2Demo.jar
- будет интерфейс как у WindowsXP-элементов (не работает в UNIX).

Старая тема Metal в Java 6.0 (замена Ocean):
> cd /usr/local/jdk1.6.0/demo/jfc/Java2D/
> java -Dswing.metalTheme=steel -jar Java2Demo.jar


A Swing Architecture Overview:
http://java.sun.com/products/jfc/tsc/articles/architecture/
Спасибо, попробую...
Добавлю.
В Swing Look&Feel делится на системно-независимый (Metal, Ocean, Motif), который выглядит одинаково в любой системе, и системно-зависимый (Gtk, Windows, Aqua), который работает только в тех системах, в которых есть поддержка одноимённых интерфейсов.

В новой Java SE 6 Update 10 появился системно-независимый Look&Feel Nimbus, который придёт на смену Ocean в следующей версии Java.
да, в 6 джаве свинг стал шустрее
Согласен с автором в том плане, что внешний вид GUI можно исправить или нарисовать вообще свой неповторимый. Только я бы добавил, что найти качественный и 100 % похожий (например, на WinXP) look and feel достаточно непросто (Многие разработки "пролетаю", когда в XP меняешь системные цвета). Если писать его самому, то этот процесс трудоёмкий и не такой простой как может показаться . Поэтому и выходит, что создать похожий GUI на нативный на Java сложнеее, чем "наклепать" форму на VB (даже не думая о похожести).
Хорошая статья, достаточно посмотреть на ту же Идею чтобы понять миф об "убогости"
Спасибо большое за статью.
Недавно начал изучать Java и, честно говоря, меня немного смущал «спартанский» интерфейс Swing-приложений.
Совершенно верно. Писал сложное десктопное приложения на Яве на Swingе. Достаточно понятный код. Под конец поставил look&feel Liquid (по-моему так называется), сам обалдел от интерфейса.

Никакой Делфи и Visual C не давал мне таких результатов как с технической так и с эстетической точки зрения.
А разве разработка приятного GUI на Java не требует дополнительно времени?
Нужно этот visualization layer еще и зпрограммировать. Насколько это много времени занимает?
У вас всегда имеется три элементарных возможности:

1. Взять один из многих профессионально разработанных визуальных интерфейсов и “включить” его в вашем приложении. Это строчки 4 кода и пару минут времени. Интерфейсов на рынке много, главное тут знать, что такая возможность есть и вы абсолютно не обязаны использовать тот интерфейс, который включается фреймворком по умолчанию.

2. Вы нашли подходящий вам интерфейс, вас всё в нём устраивает, однако хотелось бы точно такой же, но с перламутровыми пуговицами. Вы чертыхаетесь про себя, засучиваете рукава, наследуете пуговицу, и в пару часов, мучительно подобрав подходящий оттенок перламутровости, делаете все пуговицы изысканно перламутровыми. Все прутся.

3. Вы по настоящему серьёзный мен. Вас категорически не устраивает всё то барахло, которое в изобилии присутствует на рынке. Вы звякаете Сальвадору Дали и просите его сделать для вас пару набросков поприличней. Сажаете програмера и он в месяц кладёт их на код. В силу чёткой очерченности всей интерьерной рисовки, эта работа абсолютно никак не затрагивает разработку других частей приложения, даже интерфейсных. Получаете на выходе шедевр, тем самым заставляя С. Джобса нервно курить в стороне.
Мощно задвинул :)
Нужно просто указать Java использовать системный Look&Feel и она будет автоматически рисовать GUI как в ОС. Занимает это одну строку (5 с обработкой Exception на всякий случай).
Спасибо, интересно просто как это устроено в JAVA.
Можно не программировать, а подключить в готовое приложение:
http://molgav.nn.ru/index.php?option=com_content&view=article&id=46%3Ae-laf---&Itemid=55
Ведь недаром он имеет название Pluggable Look and Feel — PLAF.
Самая важная деталь свинга как раз не в скинах и возможности рисовать красивые формы, а то что он дает возможность ( иногда и заставляет ) писать "правильный" код! Как раз "правильность" свинга и позволяет натягивать шкуры какие вам только вздумается. По этому людям с дельфи(билдера) достаточно сложно поначалу разобраться в этой кухне, но как только придет понимание вы начнете совсем подругому смотреть на вещи которые раньше писали.
Согласен, Swing вообще очень красиво и грамотно спроектирован. Там есть чему поучиься. Просто в данной заметке я хотел коснуться именно возможности делать красивый графический интерфейс на Java. Ибо, по человечески, обидно в очередной раз читать, что Java выглядит некрасиво. В то время, как именно Java и даёт хорошую возможность делать крайне элегантные интерфейсы.
согласен с Вами, в своё время прошёл такую "ломку" и ни сколько не пожалел об этом.
+1. Здравый смысл торжествует!
Правильная статья. И мало того, хорошо написана. Лично для себя не нашел ничего нового, но дочитал до конца - читать было приятно. Ловите плюс в карму.
Успел прочитать несколько абзацев и споткнуться уже раз сто тысяч. Рандомное расставление запятых в пределах предложения и кривая грамматика уже в моде? или это обуславливается наплывом на хабр молодежи?
Ну зачем NetBeans обидел, а? :) Нормальное IDE и тоже пример Swing. При этом NetBeans 6 мимикрирует под виджеты ОС (с помощью LookAndFeel) — нативно выглядит и под Linux (GTK+) и под Windows XP/Vista. По-моему, тоже хороший пример для статьи.
Статья хорошая, но как-то не обращено внимание, что Swing приложения очень хорошо мимикрирует под ОС. Можно было бы скриншотами показать :).
А какие вкусности Java SE 6 Update 10 готовит (https://jdk6.dev.java.net/6u10ea.html) Поддержка аппаратного ускорения графики, новый стандартный look&feel Nimbus вроде симпатичным должен быть, можно будет делать апплеты которые пользователь может "вытащить" из браузера как отдельное приложение.
молодец!

зы может пора открыть блог по java (и\или даже groovy, вдруг есть желающие)?
Вот ещё блог:
http://weblogs.java.net/blog/kirillcool/archive/2006/09/index.html
Использование Substance Look&Feel на практике. Кастомизация потрясающая.
собственно kirillcool - это автор Substance Look&Feel
уважаемые Java-программисты, будте добры внесите ясность с GUI тулкитами для Java:
1. Swing - входит в стандартный JDK и отрисовует элементы сам, т.е. не использует стандартные компоненты ОС
2. SWT - решение от IBM, максимально использует родные виджеты ОС

так?
По сути - примерно так.
Видимо, на сегодняшний день, не совсем точно называть SWT решением от IBM. Проект координируется некомерческой организацией Eclipse Foundation, которая таки была создана при сильном участии IBM. Есть и другие участники альянса. По сути из под крыла IBM пустили в Open Source, создав альянс Eclipse. SWT он не то что бы даже использует родные виджеты ОС, он явяется Java слоем к графическим библитекам той среды, для которой собирается приложение. К примеру к Gtk+. Делает он это через Java Native Interface (JNI).
API библиотеки Swing независим от операционной системы, но сама библиотека Swing основана на AWT. AWT, в свою очередь, системно-зависимый тулкит. Swing — просто обёртка над низкоуровневыми средствами Java2D в AWT и использует из тулкита только класс-контейнер java.awt.Container (т.н. "тяжеловесный" контейнер), совершенно не задействуя пиры AWT (peer'ы — посредники между нативными компонентами операцинной системы comctl3d.dll в Windows и библиотеками в UNIX и виджетами AWT). Поэтому у Swing-виджетов ("легковесных" компонентов) нет хэндлов окон как у кнопок в Windows — виджеты отрисовываются на канве AWT-контейнера, к которому они приписаны, средствами Java2D. Диспетчеризация событий (события от нажатий на Swing-кнопки, выделение элементов в списках и т.д.) обеспечивается диспетчером AWT-контейнера и очередью событий AWT, которые имеют прозрачный интерфейс взаимодействия с моделью легковесного компонента.
Подробнее обо всём внутреннем устройстве Swing описано в книге:
Иван Портянкин "Swing. Эффектные пользовательские интерфейсы", изд. Питер, 2005 г., 528 стр., ISBN 5-469-00005-2
(Можно найти электронный вариант этой книги)

Библиотека SWT построена на основе нативных (через JNI) вызовов системных элементов управления. Для Windows вызовы из Java-кода библиотеки SWT идут к библиотеке comctl3d.dll, для UNIX вызовы из Java-кода библиотеки SWT идут к библиотекам Gtk,Atk, Cairo, GNOME, Mesa. Так что для использования SWT нужно определиться с целевой операционной системой и брать соответствующий порт библиотеки.
большое спасибо за исчерпывающий ответ.
Поправлюсь

Немногие Swing-виджеты наследуются от тяжеловесных AWT-компонентов. Это либо контейнеры, либо диалоги:
класс javax.swing.JFrame (наследник java.awt.Frame),
класс javax.swing.JWindow (наследник java.awt.Window),
класс javax.swing.JDialog (наследник java.awt.Dialog),
класс javax.swing.JApplet (наследник java.applet.Applet и "внук" java.awt.Panel).
Остальные виджеты Swing не имеют "тяжеловесных" предков.
Замечательная статья!

Хотелось бы добавить, что красивый интерфейс - это не только красивые шкурки/картинки, но и продуманное их расположение. Так, например, чтобы сделать "родной" OS X интерфейс стоит следовать Apple Human Interface Guidelines. Надо сказать, что документ очень исчерпывающий и подходит не только для яблочных систем.

Также хотелось бы оставить ссылку на блог, недавно мной открытый. Там очень интересно написано про кастомизацию интерфейса для той же OS X. Читал, запускал у себя и поражался до чего наука дошла!
Да, интересный документ. Всяко для общего развития почитать стоит.
Будем и в блог посматривать. :-)
Для разработчиков и дизайнеров интерфейса на Swing существует отдельный
Java Look and Feel Design Guidelines
http://java.sun.com/products/jlf/ed2/book/HIGTitle.html
"Родное" оконное приложение под ОС _заметно_ быстрее и экономичнее Swing-ового. Сколько раз смотрел - всегда так было.
Эт-та хорошо. Значит закон сохранения энергии пока ещё работает.
Работал в эклипсе, работаю в идее. На мой взгляд, эклипса, всё-таки, быстрее. То есть есть места, где идея обгоняет эклипсу, но именно интерфейс у эклипсы по моим ощущениям чуть быстрее. Идея более "ватная" какая-то. Возможно ещё, что на разных платформах по-разному. Мой опыт базируется на линуксе.
до сих пор люблю этот язык, хотя отошел от программирования.
Жаль, что он распространяется не так быстро и эффективно как хотелось бы.
Всем бы так научиться IDE делать, как IDEA...

Лично мне SWT не нравится, хотя эклипса спроектирована довольно удачно как фреймворк.
Не хотелось заниматься «некропостингом», но всё же…

Вы первый кто так красиво и лаконично объяснил «что и почём», если можно так выразиться, а то претензиям и душевным порывам отдельных людей в сторону Java/Swing зачастую просто нет предела.

Думаю собрать выжимку из всей статьи и кидать «в лицо» всем тем негодяям, чтобы неповадно было :)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.