2010-01-13 2 views
2

Если вы хотите написать настольное приложение в java для windows, mac и linux, будет ли код одинаковым для всех из них?java на всех платформах

и вы просто изменяете графический интерфейс, чтобы приложение Windows было более похожим на Windows и так далее?

Как это работает, не вникая в детали?

+4

'' Напишите один раз, отлаживайте везде! »' :-) – SLaks

+4

Неплохо, это сохранилось через 8 минут без добавления общей суммы переполнения стека. – Pool

+4

@Slaks: На самом деле, у меня есть несколько приложений графического интерфейса Java, которые, похоже, хорошо работают в Windows, Linux и OSX с не одним конкретным заявлением O/S. –

ответ

5

Один из пунктов продажи Java - это «Write Once, Run Anywhere» (в значительной степени).

Скомпилированный байт-код выполняется виртуальной машиной Java (JVM). JVM специфичен для платформы, на которой он работает, но один и тот же байт-код может быть выполнен любой платформой с JVM. Код не нужно перекомпилировать.

Swing - это кросс-платформенный инструментарий GUI для Java. Вы можете настроить его так, чтобы он имел графический интерфейс, который выглядит одинаково на разных платформах (он не будет выглядеть никчемным на любом из них), или вы можете сказать ему использовать наиболее подходящий внешний вид для платформы, выполняется. Поэтому, если вы запустите Windows, это будет выглядеть как приложение Windows, если вы запустите OS X, это будет выглядеть как родное приложение Mac.

+0

Что вы имеете в виду? (он выиграл ' t выглядеть родным на любом из них) " – ajsie

+0

Существует кросс-платформенный внешний вид, который по умолчанию. Это не похоже на приложение Windows, оно не похоже на приложение Mac, оно выглядит как приложение Java.Но, как я уже упоминал, вы можете сказать Swing вместо этого использовать «системный внешний вид», что означает, что пользовательский интерфейс будет очищен, если не будет лучшего термина, как родные приложения на платформе, на которой он работает. –

+0

он означает, что он будет выглядеть, как Java-приложение. Он будет похож на собственные приложения, но окна и диалоги (например, поле FileOpen) будут совсем другими. Полезно, но другое. –

3

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

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

Простой.

Примеры: Swing, AWT(with bugs, read below) и QT(with caveats) или SWT (people seem to like it)

+0

Я слышал, что awt устарел. поэтому он стоит между Swing и QT? – ajsie

+0

Единственная проблема с этим ответом заключается в том, что AWT не всегда работает со всеми операционными системами. У меня был опыт работы с полноэкранным приложением, которое не работало на Mac, но отлично работало на моей машине под управлением Windows XP. – mnuzzo

+1

AWT по-прежнему доступен в обычной системе Java - Swing построен поверх него. –

2

Мало того, что код будет то же самое, но составлен результат будет таким же (выход JAVAC, Java-компилятор), по крайней мере, теоретически , JVM, установленный в каждой операционной системе, заботится о переводе скомпилированного вывода (так называемого «байт-кода») в код конкретной платформы. Это означает, что, по большей части, вы можете, например, создавать и создавать Java-приложение на Linux и запускать его на Windows или Mac.

+1

Более подробно, возможно, нарушая «не вдаваясь в детали»: можно написать специфический для платформы «родной» код, который, естественно, является родным для этой ОС. По большей части, однако, если вы придерживаетесь того, что поставляется с Java и хорошо продуманными библиотеками, ваше подчиненное приложение должно работать на разных платформах. – Matt

+0

, но могли бы вы в себе. Примените: «если OS = Windows, запустите коды ... else if OS = Mac, запустите коды? – ajsie

+0

JVM компилирует его в собственный код на основе платформы во время выполнения. Java имеет тенденцию быть почти такой же быстрой как C (примерно половина скорости, в отличие от 1/100-й скорости для Ruby и 1/20 для большинства других языков), а также (очень редкий) случай быстрее, поскольку он может компилироваться с информацией, недоступной во время сборки. –

1

Если вы хотите, чтобы пользовательский интерфейс вашего приложения был «оконным» в Windows, «Mac-like» на Mac и т. Д., Взгляните на технологию SWT и RCP, которая поддерживает Eclipse. SWT, в частности, обладает теми свойствами, которые вы хотите.

Недостатком (если вы хотите это назвать) является то, что ваше приложение не сможет повторно использовать существующие существующие AWT/Swing-библиотеки. И, очевидно, вам нужно научиться использовать стек SWT.

+0

разве Swing не предоставляет этот платформоподобный интерфейс? – ajsie

+0

@noname - они утверждают, но вы можете обнаружить, что SWT делает лучшую работу. Взгляните на сайт, на котором я связан. –

+0

если я использую Netbeans, я могу использовать SWT без проблем? (похоже, что они связывают SWT с Eclipse в каждой статье) – ajsie

1

Люди обычно говорили, что Swing не произвел собственных результатов на разных платформах. По-видимому, все изменилось, и Свинг теперь почти идеальный. Пойдите Свинг! Это отличная новость для тех из нас, кто любит Java (и Groovy! И JRuby!). Это может быть premature, но это в работе.

Java будет работать и хорошо, и вы сможете писать и компилировать один раз для виртуальной машины. Тем не менее, вам нужно будет упаковать приложение для каждой платформы по-разному, если вы хотите, чтобы пользователь не должен был вводить java -jar app.jar. На OSX вам нужно сделать .app (очень просто), и есть много вариантов запуска для Windows и Linux. Также Java WebStart - еще одна возможность.

Надеюсь, что это поможет.

Редактировать: Как заставить Swing работать на OSX и казаться родным, требуется несколько дополнительных шагов. См. here.

+0

, так что с Swing вы не будете выглядеть так же, как родные приложения? Итак, какой GUI API вы использовали бы для этого? (так что почему eclipse и netbeans не выглядят родными =)) – ajsie

+1

Возможно, было правдой много лет назад, что приложения Swing не выглядели родными, но в наши дни они в значительной степени неотличимы, особенно на Mac и Windows. В Windows Swing теперь делегирует ОС для рисования компонентов. –

+0

Спасибо noname за указание, что Eclipse (SWT) и Netbeans (Swing) не выглядят родными. Я не знаю, есть ли какие-то варианты, но, как вы сами заметили, Дэн Дайер, похоже, чувствует себя иначе - Swing и SWT не выглядят родными. Но они хорошо выглядят :) –

2

Сам код будет работать на любой платформе, на которой есть виртуальная машина Java, потому что все JVM переводит один и тот же точный байт-код в машинный код, специфичный для ОС.

Что касается внешнего вида, существует способ (UIManager.getSystemLookAndFeelClassName()), который позволяет вам использовать интерфейс, который соответствует GUI, который соответствует остальной ОС. Он возвращает разные результаты для разных ОС.

+0

этот Swing вы говорите? – ajsie

+0

Да - взгляд и чувство - вещь Свинг. –

1

Если учитывать ваше приложение в трех различных слоев:

  • логики
  • презентации (если это графическое приложение, это будет использовать Java2D или эквивалент)
  • взаимодействие - кнопки, меню, диалоги и т.д.

Тогда вы можете использовать один и тот же код для всех трех на разных платформах, но он будет только «чувствовать» прямо на одном из них. Как правило, логика и презентация не будут меняться, но взаимодействие должно измениться, если приложение Java будет имитировать собственные приложения.

Например, по умолчанию в OS X используется меню в верхней части экрана, а по умолчанию в Windows и Gnome - меню в верхней части окна. Gnome обычно имеет свойства приложения под редакцией, Windows под Windows и OS X под символом яблока (или что-то еще), поэтому детали меню не должны быть одинаковыми. Каждая система имеет разные правила компоновки и шрифта, только некоторые из которых реализованы в стиле Swing, имитирующем внешний вид.

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

+0

, поэтому один код может быть развернут на всех платформах. И такой же код может быть использован для веб-приложения? как насчет мобильного приложения? мне нужно изменить/переписать код? – ajsie

+0

Логика будет одинаковой для веб-приложения, но вам потребуется различная презентация. Я никогда не ориентировался на мобильные устройства, поэтому не знаю всех ограничений, но вам придется настраивать логику на то, что доступно на J2ME, а не на J2SE –

+0

, но логика в веб-приложениях использует Java EE поверх Java SE. так что бы настольное приложение не было подходящим для Интернета? – ajsie

1

В целом, да, java обычно записывается после запуска в любом месте. Это «Skinned», чтобы соответствовать платформе. Вы должны обратить внимание на информацию об оборудовании, такую ​​как размер экрана, если вы ожидаете, что он будет работать на телефоне.

Обратите внимание, что он также будет работать на кабельных коробках - я работаю над некоторыми вещами.

Даже взаимодействие с конкретными элементами платформы часто находится в одной и той же кодовой базе - поэтому, если у вас есть библиотека, которая обнаруживает наличие панели инструментов Windows, вы можете обнаружить ее и поддерживать ее, если она доступна, но код просто не будет обнаружить его на Mac (или использовать другую библиотеку).

Компетентный инженер, однако, не должен перекомпилировать другую платформу.

0

В настоящее время я работаю над веб-приложением, где мы регулярно делаем нашу разработку на Windows, но тестирование и производство на Linux. Раньше я писал приложения с графическим интерфейсом, где один и тот же код работал как на Windows, так и на Linux. Я никогда не делал Java на Mac, но я предполагаю, что это порты, а также между Windows и Linux.

Красота Java - это то, что 90% времени вам даже не нужно об этом думать. Вы просто пишете код, который будет работать на платформе, на которой вы разрабатываете, и это будет волшебным.

Единственное, что обычно является проблемой для меня, - это работа с файлами. В Java есть некоторые функции, которые помогают, но иногда вам приходится уходить с пути, чтобы воспользоваться ими. Например, имена файлов различны: на окнах у вас есть спецификатор диска (например, «C:»), а в Linux вы этого не делаете, а в Windows вы разделяете имена каталогов с обратными косыми чертами, а на Linux вы их разделяете с помощью косой черты. Есть функции, позволяющие вам обрабатывать это с помощью общего кода, но бывают случаи, когда это боль. И т. Д.

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

Мне тяжело думать о чем-то еще, что было проблемой для меня. Я уверен, что если вы попробуете, вы можете придумать что-то, что нужно сломать на одном или другом, но это единственное, что я помню, когда я сталкивался, не ища проблем.

Смежные вопросы