Затачиваем свое Java-приложение под Mac OS X. Часть 1

Добавлено : 22 Mar 2009, 10:20

Задумывались ли вы когда-нибудь, что существует рынок потенциальных пользователей вашего Java-приложения, о котором вы, скорее всего, даже не подозреваете? У каждого из этих пользователей есть предварительно установленная по умолчанию Java 2 Standard Edition (J2SE) версии 1.3.1. При этом они могут ничего не знать об этом. И при помощи нескольких нехитрых приемов вы можете придать своему Java-приложению вид настоящего приложения Max OS X, которое пользователи смогут установить и использовать даже не подозревая о том, что на самом деле это приложение является платформонезависимым Java-приложением. Согласитесь, звучит заманчиво!

Mac OS X построена по всем канонам операционных систем BSD UNIX и поставляется вместе с J2SE и Java Web Start. Разработчики могут открыть окно терминала и обнаружить, что множество их любимых утилит и инструментов уже установлены. Как, например, vi, emacs и Java. Буквально одним щелчком мыши вы можете запустить веб-сервер Apache. Mac – это великолепная платформа для Java-разработчиков, с большим количеством коммерческих, бесплатных и open-source инструментов разработки приложений. Не важно пишите ли вы приложения под Mac или нет, потратьте немного времени, чтобы внести совсем немного небольших изменений в ваше приложение так, чтобы предоставить хорошие условия работы с вашим приложением миллионам потенциальных пользователей/заказчиков, которые уже работают под Mac OS X. Конечных пользователей не интересует, на каком языке программирования написано ваше приложение, их больше волнует его привлекательность, удобство и простота использования.

В этой серии статей мы рассмотрим некоторые приемы, воспользовавшись которыми, вы сможете сделать свое Java-приложение максимально приближенным по внешнему виду и функциональности к обычному Mac-приложению. Для того чтобы это провернуть нам понадобится три подхода, каждый из которых будет освящен в отдельной статье, при этом ваше приложение не будет выглядеть как-то неестественно на других платформах, не на Mac. В этой статье мы обратим внимание на различные runtime-свойства, которые позволят вам менять расположение главного меню, настраивать и изменять меню приложения, а также улучшить внешний вид компонентов фрейма на форме приложения. В следующий раз будут рассмотрены некоторые изменения в исходном коде программы, которые позволят управлять реакцией на различные комбинации клавиш, настраивать внешний вид меню, увеличить производительность вашего приложения. В третьей статье мы остановимся на методах упаковки приложения, а также его подготовки к установке и работе на Mac-платформе так, чтобы пользователям не приходилось думать о каких-то там jar-файлах, shell-скриптах, или об окне терминала.

В июле 2002 года на MacWorld Expo, генеральный директор Apple, Стив Джобс, в своем отчете сообщил слушателям, что на тот момент существовало приблизительно 2.5 миллиона пользователей Mac OS X, и, что в конце 2002 года, их будет насчитываться около 5 миллионов. Как Java-разработчик, вы понимаете, что это очень малый процент пользователей на рынке персональных компьютеров. Но вы также должны осознавать, что каждая новая версия Mac OS X будет готова выполнять ваши Java-приложения, поскольку в поставку включены как JRE, так и JDK для Java 2 Standart Edition. Поэтому для Java-разработчиков, Mac-платформа является вдвое перспективней, чем для любого другого разработчику.

Итак, давайте перейдем непосредственно к первому этапу. В качестве примера приложения возьмем open-source приложение JUnit. Во-первых, потому, что оно написано не для Mac-платформы, это очевидно, и содержит множество элементов управления, внешний вид и расположение которых нам нужно изменить так, чтобы максимально приблизить их к тому, как это должно быть в обычном Mac-приложении.

Для начала сходите на домашнюю страницу JUnit (http://www.junit.org/) и скачайте последнюю доступную версию этой программы. После этого распакуйте .zip архив. Теперь откройте окно терминала вашей Windows-машины и перейдите в директорию с программой, например в junit3.8. Чтобы запустить JUnit выполните следующее:

java -cp junit.jar;. junit.swingui.TestRunner
    junit.samples.AllTests

Будет запущена Swing-версия приложения, класс TestRunner, и после этого запустятся тесты класса junit.samples.AllTests. Вы должны будете увидеть что-то похожее на это:

Рис. 1. JUnit на Windows-платформе

Вы, должно быть, удивитесь, но подобным же образом можно выполнить это приложение и на Mac. Теперь, работая под UNIX (Mac OS X) вы можете открыть окно терминала и запустить JUnit точно так же, как вы это сделали под Windows. Для того чтобы запустить окно терминала выполните пункт меню “Terminal application” в Applications/Utilities. После того, как вы скачаете zip-архив с JUnit, воспользуйтесь утилитой jar, чтобы распаковать его. Хотя в Mac есть свой собственный универсальный распаковщик Stuffit, но в ранних версиях эта программа имела несколько ошибок при распаковкее файлов с длинными именами, поэтому некоторые файлы из архива с JUnit могут быть переименованы, что нежелательно. Но вы можете избежать этих проблем, если воспользуетесь утилитами jar или gunzip, вместо Stuffit.

Есть несколько различий между запуском JUnit на Mac OS X. Во-первых, вам не нужно беспокоиться по поводу, установлена или нет виртуальная Java-машина (JRE), поскольку она является частью операционной системы. Во-вторых, вам нужно учитывать то, что необходимо заменить в командной строке символы “\” (backslash) на “/” (slash). Поскольку “/” является стандартным разделителем в UNIX-подобных системах. И теперь в окне терминала выполняем следующее:

java -cp junit.jar:. junit.swingui.TestRunner
    junit.samples.AllTests 

Без всяких изменений, внешний вид этого приложения под Mac OS X будет выглядеть следующим образом:

Рис. 2. Внешний вид JUnit под Mac OS X

Даже не предпринимая никаких дополнительных действий, например, не устанавливая какой-либо look&feel для своего приложения, мы получаем Aqua, который используется по умолчанию в Mac OS X. Многие элементы управления: полосы прокрутки, кнопки, закладки – многое уже делает наше приложение, как будто написанное специально под Mac OS X. Теперь давайте посмотрим, что же мы сможем сделать с runtime-свойствами, чтобы придать этому приложению более презентабельный и естественный вид.

В Mac OS X меню приложения всегда находится вверху экрана. Для пользователей, которые долгое время пользовались Windows, это может показаться диким, тогда как для опытного Mac-пользователя такое положение меню приложения кажется вполне естественным. Не будем останавливаться на обсуждении того, что есть удобнее и правильнее. Каждому свое. Поэтому, в идеале, ваше приложение должно удовлетворять как пользователей Windows, так и тех, кто работает на Mac.

Благо, что Apple позаботились о том, чтобы максимально упростить процесс перемещения меню приложения, когда оно (приложение) запускается под Mac. Для этого вам нужно всего-навсего изменить значение системного runtime-свойства com.apple.macos.useScreenMenuBar с false на true. Это можно сделать прямо из командной строки, например:

java -cp junit.jar:. -Dcom.apple.macos.useScreenMenuBar=true
    junit.swingui.TestRunner junit.samples.AllTests

Теперь сравните изображение, приведенное ниже, с тем, что на рисунке 2, в котором мы не перемещали меню.

Рис. 3. Теперь меню приложения вынесено на свое место (на форме приложения оно отсутствует)

Итак, на этом этапе мы изменили положение меню приложения, поместив его на свое место, как это и положено в Mac OS X. Однако пользователь может очень смутиться тому, что в заголовке имени приложения содержится имя класса “junit.swingui.TestRunner”. Согласитесь, что было бы весьма желательно поменять этот заголовок на что-нибудь более понятное и не отпугивающее, например: “JUnit on Mac OS X”. Добиться этого мы можем, изменяя значение параметра –Xdock:name. Вот пример запуска приложения с этим параметром:

java -cp junit.jar:. -Xdock:name="JUnit on Mac OS X"
    junit.swingui.TestRunner junit.samples.AllTests

Чтобы не загружать командную строку множеством различных опций, мы посмотрим на результат только лишь изменения этого параметра, не перемещая меню, как это следовало бы сделать. Естественно, что вы можете изменять единовременно столько runtime-свойств и параметров, сколько вам нужно, но пока нам важно увидеть результат, рассматриваемого параметра. Вот что у нас вышло:

Рис. 4. Теперь заголовок приложения изменен на желаемый (меню не перемещено).

Теперь давайте посмотрим на меню приложения:

Рис. 5. Содержание меню приложения JUnit

Вы видите по рисунку 5, что название приложения в меню также изменилось на то, что мы задали в качестве значения параметра. Меню также содержит несколько стандартных функций, которые обеспечивают, например, сокрытие и выход из приложения, Hide и Quit. Эти же функции можно вызвать нажатием Command-H и Command-Q, соответственно. Единственный пункт меню, который обычно присутствует в меню приложения, но не созданный в данный момент для нашего приложения – это пункт About. Вы можете установить имя для этого пункта меню и добавить его в меню приложения, изменив runtime-свойство com.apple.mrj.application.apple.menu.about.name. Например:

java -cp junit.jar:. -Dcom.apple.mrj.application.apple.menu.about.name=JUnit
    junit.swingui.TestRunner junit.samples.AllTests

Теперь в меню приложения добавлен пункт “About JUnit”, но, к сожалению, при его выполнении ничего не происходит. Даже учитывая то, что в JUnit включен About box, все же необходимо внести небольшие изменения в исходный код программы, чтобы все работало, как следует. Поэтому отложим это до следующего раза. А пока, вот что у нас получилось:

Рис. 6. Меню приложения с пунктом меню “About JUnit”

Теперь, давайте более подробно остановимся на настройке look&feel приложения JUnit. Например, обратите внимание на то, что в правом нижнем углу кнопка Exit размещена немного некорректно:

Рис. 7. Положение кнопки Exit до исправлений.

В идеале нам нужно было бы немного сместить кнопку Exit чуть выше и левее. Но для этого пришлось бы возвращаться к исходному коду и изменять его. Но мы можем исправить сложившуюся ситуацию изменением системного свойства com.apple.mrj.application.growbox.intrudes, например:

java -cp junit.jar:. -Dcom.apple.mrj.application.growbox.intrudes=false
    junit.swingui.TestRunner junit.samples.AllTests

Теперь все выглядит куда естественнее:

Рис. 8. Положение кнопки Exit после исправлений.

Однако подобным образом не всегда можно решить все проблемы возникающие с наложением. Хотя в нашем случае получилось очень даже неплохо.

Еще одно, что вам следует знать об особенностях Mac OS X, так это поведение приложения при попытке изменить его размер. По умолчанию размер Java-приложения можно изменять в Windows-системах и в некоторых приложениях Mac OS X. Но такое поведение не является обычным для Java-приложений под Mac OS X. Поэтому, если вы хотите, чтобы пользователь мог свободно изменять размер вашего Java-приложения, следует изменить следующее runtime-свойство, например, вот так:

java -cp junit.jar:. -Dcom.apple.mrj.application.live-resize=true
    junit.swingui.TestRunner junit.samples.AllTests

И еще одно не маловажное свойство позволит управлять размером шрифтов вашего приложения. Довольно трудно писать кросс платформенное приложение и спроектировать GUI, если вы хотите точно определить расположение и размер всех компонентов. Потому, как, например, размеры шрифтов на разных платформах – разные. Поэтому Apple позволяет вам выбирать между большими или малыми закладками. По умолчанию используются большие закладки. Чтобы установить малые закладки, выполним следующее:

java -cp junit.jar:. -Dcom.apple.macos.smallTabs=true
    junit.swingui.TestRunner junit.samples.AllTests

Следующие два рисунка показывают разницу между большими и малыми закладками:

Рис. 9. Большие закладки.

Рис. 10. Малые закладки.

Итак, установив всего лишь несколько runtime-свойств, ваше Java-приложение заметно больше походит на родное Mac OS X приложение без всяких изменений исходного кода программы. Это означает, что все вышепоказанные изменения вы можете внести даже, не имея под рукой исходного кода программы. В следующей статье мы погрузимся глубже и попытаемся несколько изменить исходный код программы с тем, чтобы улучшить и облегчить жизнь Mac-пользователей нашего Java-приложения.

Теги: MacOS swing