Развеиваем мифы или Java с человеческим лицом

    Написать небольшую заметку на данную тему я решил после того, как прочитал тут на Хабре, обсуждение о выборе языка разработки для нового десктоп приложения. С завидным постоянством упоминался тот момент, что визуально, приложения на Java выглядят аляповато. Вот и решил я, слегка, прояснить это вопрос.

    Итак, в чём же состоит особенность реализации десктоп приложений на Java и почему они способны быть очень красивыми? А также, откуда родился миф об ущербности (некоторые экзальтированные личности, порой, склонны даже употреблять слово ‘убогость’) Java GUI, читайте ниже. Я постарался не вдаваться в тонкости, не писать никакого кода, да и вообще не использовать никаких специфических для Java мира знаний. Хотелось бы, что бы заметка была понятна людям, далёким от этой технологии.

    Большинство эрудированных программистов таки знают, что… Java приложение должно быть максимально кросс-платформенным. Также, как правило, самые эрудированные из них знают и то, что стандарты на внешний вид для разных операционных систем несколько отличаются. Стало быть возникает и вопрос, а как собственно то достичь того, что бы приложение выглядело красиво, в том понимании красоты, как её привыкли оценивать пользователи конкретных операционных систем?

    А вот как. Видимо, не ошибусь, если скажу, что любой из нас знает, что такое Winamp. И скорее всего знает что такое skin (кожа). Мы все привыкли к тому, что эта программа может выглядеть абсолютно иначе, если ей поменять “кожицу”. Разумеется этой особенностью обладают и многие другие программы. А теперь вернёмся к нашим ба… нашей Java. Основным программным фреймворком, который используется для разработки Java десктоп приложений и стандартно поставляется в составе платформы, является Swing (гусары молчать!). Этот фреймворк вообще является хорошим примером проектирования ООП приложений, но сейчас, нас в нём интересует только две его особенности.

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

    Особенность номер два – вся эта рисовательная мутотень, тщательно и аккуратно вынесена в отдельный слой со своим чётко постулированным и открытым интерфейсом. Слой этот, по умному, называется Look&Feel. А вот тут, прошу обратить особенное внимание на слова “чётко постулированный открытый интерфейс”. Что это означает по жизни? А по жизни, это означает, ни много, не мало, что мы имеем эдакую “программную кожицу” (skin) которую может по своему вкусу реализовать абсолютно любой разработчик, знающий этот замечательный язык Java. Круглые, полупрозрачные кнопки с прыгающими внутри логотипчиками Windows? Нет проблем!

    Но это ещё не всё. Главное то, что уже давно появился рынок этих самых Look&Feel. То есть имеется большая кодла энтузиастов, которые принялись с энтузиазмом эти Look&Feel-ы рисовать, с точки зрения их личностного понимания природы красоты.

    Разумеется, для разминки, вначале появились кожицы делающие внешний вид и поведение как у Outlook (всех версий можно найти), как Windows XP, как известные интерфейсы из Юникс мира и… пошло поехало. Как вы правильно понимаете, давно есть Look&Feel дающие Java программе внешний вид приложений и как в ОС от компании Apple. Включая работу стандартных клавиш для доступа к элементам интерфейса.
    В стандартной поставке библиотек Java идёт несколько реализаций разных Look&Feel. Люди, имеющие доступ к интернету, могут найти неплохие образцы, к примеру, вот тут:

    www.jidesoft.com

    или тут:

    www.incors.com/lookandfeel
    www.javasoft.de/jsf/public/products/synthetica/themes

    Как вы понимаете, это всё также означает следующее – любая программа на Java, написанная с помощью Swing, может иметь а-абсолютно любой мыслимый визуальный интерфейс, который будет выглядеть совершенно одинаково в любой операционной среде. А с другой стороны, любая программа может поставляться с несколькими визуальными интерфейсами, которые можно прямо из меню переключать во время работы. И эти красивые интерфейсы уже давно сделали за вас и бесплатно раздают. Или платно раздают. Те иногда даже получше бесплатных. Хотя и не всегда. Очевидно также и то, что все эти визуальные компоненты наследуются от одного общего предка и, стало быть, опираясь на него, вы можете придумать свой визуальный компонент, который будет рисоваться и работать так, как лично вам это нравиться. Учитывая всё вышеописанное (и проверенное мной на практике), утверждение, что Java некрасива, это видимо происки микрософтофилов, не сумевших оперативно (в присутствии заказчика) отличить Java Windows XP Look&Fell от родного Windows XP. Другое объяснение мне пока сложно найти. :-)

    Тут, видимо эстеты, мне возразят, а не очень ли долго вся эта красота рисуется, этож получается, что каждый пиксель то на Java нужно отрисовать? И будут частично правы. Это действительно на несколько миллисекунд дольше. Для эстетов, в Java мире существует другой подход и другой фреймворк. Называется он SWT (Standard Widget Toolkit). Разумеется открытый и бесплатный. Ну эт и так понятно.

    Этот фреймворк построен на других принципах. Он по максимуму использует графические элементы той операционной среды, в контексте которой запускается приложение. Рисуются они, по возможности, средствами самой операционной среды, и выглядят так, как в этой среде принято. То есть кнопка, она везде будет такой кнопкой, какой её привыкли видеть пользователи той системы, где запускается приложение. Рисуется всё несколько быстрее. Выглядит – стандартнее.

    Каждый выбирает что ему ближе. Но… С точки зрения скорости работы интерфейса, есть два хороших примера. Это самые популярные на сегодняшний день Java IDE. Надо прямо сказать, это очень мощные IDE. Наверное самые мощные IDE которые сейчас существует на планете в мире разработки софта. IntelliJ IDEA и Eclipse. Первая написана на Swing, вторая на SWT. Никакой разительной разницы (да чего там, просто — никакой) в скорости работы я не заметил. Более того, существует ещё одна известная среда разработки — Visual Studio, от сами знаете кого (спокойно, это не А. Лебедев), написанная сами знаете на чём. Так вот субъективно оценивая, она также, почему-то, субъективно, быстрее не работает. Ну такие вот дела. :-)

    А теперь, пару слов об том, откуда тянется миф об убогости. Как я думаю. Стандартные примеры уровня ‘Hello World’ на Swing написаны так, что бы их можно было как-то запустить в любой среде. Как-то… Никто там не ставит шрифт Tahoma для показа текста. Там вообще три-четыре шрифта, имеющихся в любой системе. И вот запускается это безобразие с серыми, топором-отёсанными кнопками и..., работает. Везде! Но по спартански изысканно и незамысловато. Смотрят на всё это разработчики, чешут свою репу, и выносят вердикт – гавн...(зачёркнуто) не очь хороший GUI у этой вашей явы, пойду-ка я попробую Эрланг или Хаскель. Вот там уж всё, стопудово, получше сделано. И на Хабре, походу, расскажу, какая гавн...(зачёркнуто) не очень хорошая эта Java. Ну не читать же в документации всякую там ерунду про этот ваш Look&Feel интерфейс. Других забот хватает. :-)
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 54

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

                  ...да, кстати, идею на маке видели? Вот где круто. А свт... так себе.
                    0
                    идея платная по этому даже смотреть не буду)
                    0
                    В 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/
                      0
                      Спасибо, попробую...
                        0
                        Добавлю.
                        В Swing Look&Feel делится на системно-независимый (Metal, Ocean, Motif), который выглядит одинаково в любой системе, и системно-зависимый (Gtk, Windows, Aqua), который работает только в тех системах, в которых есть поддержка одноимённых интерфейсов.

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

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

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

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

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

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

                                                      так?
                                                        0
                                                        По сути - примерно так.
                                                        Видимо, на сегодняшний день, не совсем точно называть SWT решением от IBM. Проект координируется некомерческой организацией Eclipse Foundation, которая таки была создана при сильном участии IBM. Есть и другие участники альянса. По сути из под крыла IBM пустили в Open Source, создав альянс Eclipse. SWT он не то что бы даже использует родные виджеты ОС, он явяется Java слоем к графическим библитекам той среды, для которой собирается приложение. К примеру к Gtk+. Делает он это через Java Native Interface (JNI).
                                                          0
                                                          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 нужно определиться с целевой операционной системой и брать соответствующий порт библиотеки.
                                                            0
                                                            большое спасибо за исчерпывающий ответ.
                                                              0
                                                              Поправлюсь

                                                              Немногие 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 не имеют "тяжеловесных" предков.
                                                            0
                                                            Замечательная статья!

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

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

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

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

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

                                                                      Only users with full accounts can post comments. Log in, please.