Synth’етичекская заметка.

Рубрика: Java | 23 October 2008, 16:55 | juriy

Новый Look And Feel – Synth – появился в Java 5, но не был особо заметен до появления живых доказательств его работоспособности, вроде Nimbus. Основная тому причина: Synth сам по себе не является Look And Feel’ом, но предоставляет достаточно удобный API для разработки laf.

Вот как красочно описали Synth в одной из заметок на ibm.com:

The goal for Synth is simple — let developers create a new look and feel without writing one line of Java code.

Не верьте ни слову – создать приличную “шкурку” для вашей программы без Java кода не выйдет. Да и груды заметок о том, какой Synth простой – скорее преувеличение. Synth не простой. Но создать LaF на основе Synth существенно проще, чем создать LaF на основе, к примеру, BasicLookAndFeel или Metal.

Итак, что же позволяет сделать Synth? Synth позволяет при помощи XML задать типичные параметры прорисовки компонентов. К примеру, вот таким вот нехитрым способом можно сказать, что все кнопки в приложении будут отрисовываться на зеленом фоне:

<style id="Button">
	<state>
		<color type="BACKGROUND" value="#00FF00"/>
	</state>
</style>
<bind style="Button" type="region" key="Button"/>

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

Естественно, описательный формат не сможет сравниться по мощности с программно заданным поведением. Описать в XML правила вроде “на всех JLabel’ах первая буква будет написана древнеславянским рукописным шрифтом с картинкой и витязями” не выйдет. Положительный момент заключается в том, что если подобное нестандартное поведение необходимо только для одного-двух компонентов, то писать код придется только для них. Остальные, “стандартные” компоненты будут описаны в XML.

В чем же сложности?
Основных проблем я нашел три.

Проблема первая.
Synth это Tabula Rasa look and feel. То есть, изначально он пустой, чистый. Если вы забыли описать один компонент, то он не будет отрисован, в лучшем случае. В худшем, приложение свалится с NullPointerException с диким StackTrace, который заканчивается в каком-нибудь FontMetrics. Отлаживать такие ошибки бывает довольно сложно.

Проблема вторая.
Synth описывает компоненты Swing, а не сущности GUI. К примеру: ячейки таблицы, элементы List и ComboBox по-умолчанию отрисовываются при помощи JLabel. То есть, стиль JLabel напрямую влияет на вид этих компонентов. А это значит что для того, чтобы осознанно сделать LookAndFeel, нужно довольно хорошо знать Swing internals.

Проблема третья.

Третья проблема это legacy код, в котором автор делает допущения об установленном LaF. К примеру: автор создает свой компонент – более мощную и навороченную кнопку. Он создает для этой кнопки UIDelegate, который, естественно, наследует от BasicButtonUI. Здесь автор делает неверное неявное допущение, которое потом вылазит боком и ему и автору Synth-шкурки. Автор расчитывает, что запущенный LaF будет наследником Basic. Более того, автор кода наивно надеется на то, что умолчания (UIDefaults) Basic Look and Feel’а будут загружены именно так, как надо. Это, конечно, ошибка автора компонента, а не автора LaF. Но такие ошибки могут привести к тому, что хорошим LaF не воспользуются.

Несмотря ни на что, в случае, если нужно создать свой LaF я рекомендовал бы пользоваться именно Synth, а не идти более сложным путем “тюнинга” Basic или Metal.

Полезные ссылки:
http://www.ibm.com/developerworks/java/library/j-synth/
http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/synth.html

Комментариев: 23

23 Responses to “Synth’етичекская заметка.”

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

  1. Степан

    Все LnF — это УГ. Создание собственного LnF — это пионеризм. Тех, кто придумал LnF надо просто сослать на луну без права притрагиваться к компьютеру.

  2. Vadim Voituk

    Хе-хе… Вот они ненавистники Java на десктопе.
    Щас ещё и Chabster подключится :)

  3. Степан

    Я ненавистник Swing. И я ненавистник написания своего LnF, когда разработчики ОС уже предоставили множество прекрасных виджетов.

    Я люблю Eclipse и его SWT :)

  4. Juriy

    >> Создание собственного LnF — это пионеризм

    Для приложений вроде калькулятора, может и не стоит свой LaF писать. А про собственные LaF’ы стоит рассказать Google с их Google Talk, Apple или тем же пионерам из микрософта, которые решили заморочиться и изменить LaF на Vista.

    Если речь идет о Rich приложении – без кастомного LaF никак. Плюс кастомизация приложений под корпоративный стиль – очень частое пожелание серьезных клиентов.

  5. Farcaller

    Или это у меня с утра мозг не работает как надо, или вместо “Tabula Rasa look and feel”, “StackTrace”, “Swing internals” надо было писать проще и по русски…

  6. juriy

    Гм, Swing Internals и то первое длинное на русский перевел.

    Ломаю голову над stack trace.

  7. Vadim Voituk

    @Farcaller: типа некчему придраться было, а очень хотелось?

  8. Stepan

    to Juriy: Созданием L&F должны заниматься создатели ОС, а не создатели Java.

  9. Stepan

    2 Juriy: кастомизация темы под корпоративный стиль — это дурь.

  10. Juriy

    Я не буду тратить время на то, чтобы заниматься опровержением необоснованных высказываний.

    Скажем так, зачем люди выбирают кафель для ванной, или клеят обои, если зеленая краска отлично работает?
    Ну или вот пример: основываясь на ваших же высказываниях самые лучшие и удобные сайты, это сайты, которые не содержат CSS стилей, а тег IMG используют только для того, чтобы разместить фото автора. Ведь создатели ОС позаботелись о всем спектре необходимых компонент. И менять их внешний вид – признак дурного тона.

  11. FractalizeR

    2Juriy:
    >Ломаю голову над stack trace.
    Простите, вы программист или домохозяйка? :)

  12. Vadim Voituk

    FractalizeR,
    Это к чему было про домохозяйку ?

  13. FractalizeR

    Я просто не понимаю, разве есть программисты, которые не могут перевести термин stack trace?

  14. Vadim Voituk

    FractalizeR,
    Есть. Например я. Предложите ваши варианты перевода.

  15. FractalizeR

    Трассировка стека. Результат трассировки стека. Подходит?

  16. Stepan

    Трассировка — это процесс, а stack trace — это результат. Смысл совсем другой. Метод ленивого переводчика здесь неприменим.

  17. Stepan

    Результат трассировки стека — слишком длинно. И некрасиво.

  18. Vadim Voituk

    Stepan,
    +1, только хотел это же написать.

  19. FractalizeR

    Трассировка не всегда процесс. Когда я говорю вам “Степан, взгляните на трассировку стека вот этого приложения” я ведь явно не предлагаю насладиться процессом, не так ли? :)

  20. juriy

    2 FractalizeR
    Только сейчас смог ответить на ироничное
    >> Простите, вы программист или домохозяйка? :)

    Отвечу развернуто. Переводы вроде “расшарить сорсы”, “замапить сэмплы на айдишки” я вообще за переводы не считаю. Это выдумывание своих слов, которые понятны читателю только потому что он (читатель) знаком с оригиналом слова. IMO если заметка пишется по-русски, то она должна писаться либо русскими словами, либо русскими и английскими, но никак не английскими с русской транслитерацией. Такой стиль только затрудняет чтение.

    Stack Trace по-русски это стек вызовов. Строго говоря, это представление стека вызовов. При этом даже слова “стек” в русском языке нет (в словаре, конечно, не проверял).

    IMO
    - Степан, взгляните на трассировку стека вот этого приложения

    звучит хуже чем
    - Степан, взгляните на stack trace вот этого приложения
    или
    - Степан, взгляните на стек вызовов.

    Тут речь не о программировании а о лингвистике :-)

  21. FractalizeR

    2juriy:
    Я понял, прошу прощения за грубость. Было не слишком понятно, в чем заключается ваша проблема перевода.

    Что касается родных и неродных русских терминов при переводе, то, на мой взгляд, слова “стек” и “трассировка” уже привычно вошли в русский язык. Чего, конечно, не скажешь о “замапить сэмплы на айдишки”. Впрочем, в этой области народ уже давно ломает копья:
    http://www.ln.com.ua/~openxs/projects/oracle/ora067.html
    http://www.lingvoda.ru/forum/actualthread.aspx?tid=2920

    Мне кажется, тут главное не уходить ни в одну из крайностей и не пытаться называть браузер “смотрелкой” только потому, что это слово заимствовано (http://avva.livejournal.com/912875.html)

  22. juriy

    Интересные ссылки, на досуге надо почитать подробнее. Насчёт крайностей согласен. Хотя есть языки, которые каждый термин переводят используя “родную” базу. К примеру польский, там мороженное – “льоды”, а перпендикуляр – “простопадло” (тот, который “прямо падает”).

  23. FractalizeR

    Согласен. Но мне кажется, русский к ним не относится.

Leave a Reply