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

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

Задумывались ли вы когда-нибудь, что существует рынок потенциальных пользователей вашего 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.use ScreenMenuBar=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.ap-ple.mrj.application.growbox.intrudes, например:
java -cp junit.jar:. -Dcom.apple.mrj.application.growbox.intrudes=false junit.swingui.Test Runner 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-приложения.

По материалам Daniel H Steinberg
Подготовил Алексей Литвинюк, http://www.litvinuke.hut.ru



Компьютерная газета. Статья была опубликована в номере 04 за 2003 год в рубрике программирование :: java

©1997-2024 Компьютерная газета