На сколько я помню, чтобы обычное SWING приложение было более яблочным, нужно было использовать пакеты от Apple. Как минимум для работы с "яблочным" меню.
В 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.
Согласен с автором в том плане, что внешний вид GUI можно исправить или нарисовать вообще свой неповторимый. Только я бы добавил, что найти качественный и 100 % похожий (например, на WinXP) look and feel достаточно непросто (Многие разработки "пролетаю", когда в XP меняешь системные цвета). Если писать его самому, то этот процесс трудоёмкий и не такой простой как может показаться . Поэтому и выходит, что создать похожий GUI на нативный на Java сложнеее, чем "наклепать" форму на VB (даже не думая о похожести).
А разве разработка приятного GUI на Java не требует дополнительно времени?
Нужно этот visualization layer еще и зпрограммировать. Насколько это много времени занимает?
У вас всегда имеется три элементарных возможности:
1. Взять один из многих профессионально разработанных визуальных интерфейсов и “включить” его в вашем приложении. Это строчки 4 кода и пару минут времени. Интерфейсов на рынке много, главное тут знать, что такая возможность есть и вы абсолютно не обязаны использовать тот интерфейс, который включается фреймворком по умолчанию.
2. Вы нашли подходящий вам интерфейс, вас всё в нём устраивает, однако хотелось бы точно такой же, но с перламутровыми пуговицами. Вы чертыхаетесь про себя, засучиваете рукава, наследуете пуговицу, и в пару часов, мучительно подобрав подходящий оттенок перламутровости, делаете все пуговицы изысканно перламутровыми. Все прутся.
3. Вы по настоящему серьёзный мен. Вас категорически не устраивает всё то барахло, которое в изобилии присутствует на рынке. Вы звякаете Сальвадору Дали и просите его сделать для вас пару набросков поприличней. Сажаете програмера и он в месяц кладёт их на код. В силу чёткой очерченности всей интерьерной рисовки, эта работа абсолютно никак не затрагивает разработку других частей приложения, даже интерфейсных. Получаете на выходе шедевр, тем самым заставляя С. Джобса нервно курить в стороне.
Нужно просто указать Java использовать системный Look&Feel и она будет автоматически рисовать GUI как в ОС. Занимает это одну строку (5 с обработкой Exception на всякий случай).
Можно не программировать, а подключить в готовое приложение:
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 и даёт хорошую возможность делать крайне элегантные интерфейсы.
Правильная статья. И мало того, хорошо написана. Лично для себя не нашел ничего нового, но дочитал до конца - читать было приятно. Ловите плюс в карму.
Успел прочитать несколько абзацев и споткнуться уже раз сто тысяч. Рандомное расставление запятых в пределах предложения и кривая грамматика уже в моде? или это обуславливается наплывом на хабр молодежи?
Ну зачем NetBeans обидел, а? :) Нормальное IDE и тоже пример Swing. При этом NetBeans 6 мимикрирует под виджеты ОС (с помощью LookAndFeel) — нативно выглядит и под Linux (GTK+) и под Windows XP/Vista. По-моему, тоже хороший пример для статьи.
А какие вкусности Java SE 6 Update 10 готовит (https://jdk6.dev.java.net/6u10ea.html) Поддержка аппаратного ускорения графики, новый стандартный look&feel Nimbus вроде симпатичным должен быть, можно будет делать апплеты которые пользователь может "вытащить" из браузера как отдельное приложение.
Вот ещё блог:
http://weblogs.java.net/blog/kirillcool/archive/2006/09/index.html
Использование 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
Работал в эклипсе, работаю в идее. На мой взгляд, эклипса, всё-таки, быстрее. То есть есть места, где идея обгоняет эклипсу, но именно интерфейс у эклипсы по моим ощущениям чуть быстрее. Идея более "ватная" какая-то. Возможно ещё, что на разных платформах по-разному. Мой опыт базируется на линуксе.
до сих пор люблю этот язык, хотя отошел от программирования.
Жаль, что он распространяется не так быстро и эффективно как хотелось бы.
Всем бы так научиться IDE делать, как IDEA...
Лично мне SWT не нравится, хотя эклипса спроектирована довольно удачно как фреймворк.
Не хотелось заниматься «некропостингом», но всё же…
Вы первый кто так красиво и лаконично объяснил «что и почём», если можно так выразиться, а то претензиям и душевным порывам отдельных людей в сторону Java/Swing зачастую просто нет предела.
Думаю собрать выжимку из всей статьи и кидать «в лицо» всем тем негодяям, чтобы неповадно было :)
Развеиваем мифы или Java с человеческим лицом