Привет, Хабр! Представляю вашему вниманию перевод статьи «JavaFX Tutorial: Getting started» автора Vojtech Ruzicka.

Как настроить и начать работать с JavaFX, с помощью Maven, Gradle или JavaFX SDK.

Все посты в серии JavaFX:

  1. Учебник по JavaFX: начало работы
  2. Учебник по JavaFX: Привет, мир!
  3. Учебник по JavaFX: FXML и SceneBuilder
  4. Учебник по JavaFX: основные макеты
  5. Учебник по JavaFX: расширенные макеты
  6. Учебник по JavaFX: CSS стилизация

Установка Java


JavaFX, конечно, требует, чтобы у вас был установлен JDK. Получение необходимых зависимостей различается для разных версий Java.

JavaFX был представлен как часть выпуска Java 8. Однако позже он был удален из JDK и
перенесен в отдельный модуль в Java 11.

Это означает, что если вы ориентируетесь на Java 8-10, у вас есть все необходимые зависимости как часть вашего JDK уже. Ура! Если вы используете более новую версию Java — то есть 11+, вам нужно получить зависимости отдельно.

Maven


Получение и управление зависимостями вручную довольно неудобно, и в реальном приложении Вы бы редко так делали. Гораздо лучше использовать систему управления зависимостями, такую как Maven или Gradle. Таким образом, вы можете просто объявить, какие зависимости вы используете и какие версии, а система позаботится об остальном.

Архетип Maven


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

Maven имеет понятие архетипов, которое по существу означает, что вы можете создавать различные типы проекты из шаблона. Существуют многочисленные архетипы для различных типов проектов, и к счастью, есть пара для JavaFX. Архетип, который вы можете выбрать, зависит от того, какую версию Java вы используете.

Вы можете прочитать больше об архетипах Maven в следующем посте: Maven archetypes tutorial.

Архетип Java 8


Вы можете использовать com.zenjava:javafx-basic-archetype, или вы можете найти другие архетипы самостоятельно, если этот вам не подходит.

Вы можете легко сгенерировать проект из командной строки с помощью Maven, используя указанный выше архетип:

mvn archetype:generate -DarchetypeGroupId=com.zenjava -DarchetypeArtifactId=javafx-basic-archetype

Кроме того, вы можете создать новый проект Maven из архетипа прямо в вашей IDE.

Архетип Java 11


Для Java 11 вы можете использовать org.openjfx: javafx-archetype-simple.

Для создания проекта просто запустите:

mvn archetype:generate -DarchetypeGroupId=org.openjfx -DarchetypeArtifactId=javafx-archetype-simple

Ручная настройка Maven


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

Для начала вам понадобятся два компонента. Первый — Maven Plugin для Java FX.

Просто добавьте следующее в ваш pom.xml:

<build>
      <plugins>
            <plugin>
                  <groupId>org.openjfx</groupId>
                  <artifactId>javafx-maven-plugin</artifactId>
                  <version>0.0.3</version>
                  <configuration>
                         <mainClass>com.example.App</mainClass>
                  </configuration>
             </plugin>
       </plugins>
</build>

Обратите внимание, что
<mainclass>
должен указывать на ваш основной класс, который имеет метод main и расширяет javafx.application.Application. Мы расскажем об этом в следующей статье серии.

Вторая часть добавляет зависимость для элементов управления JavaFX:

<dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11.0.2</version>
</dependency>

Gradle


В настоящее время Gradle не поддерживает создание проектов непосредственно из архетипов .

Вы можете использовать неофициальный плагин Gradle Archetype и использовать архетипы Maven, упомянутые выше.
Кроме того, вы можете создать свой проект с помощью Maven из архетипа, а затем преобразовать его в проект Gradle с помощью следующей команды в каталоге, содержащем ваш pom.xml:

gradle init


Ручная настройка Gradle


Как и в случае ручной настройки Maven, вам нужно добавить плагин JavaFX:

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.8'
}

И зависимость для элементов управления:

javafx {
    version = "11.0.2"
    modules = [ 'javafx.controls' ]
}

JavaFX SDK


Есть еще одна возможность использовать JavaFX локально. Вы можете скачать JavaFX SDK. Он содержит все необходимые библиотеки, которые вы можете затем связать с проектом в вашей IDE или добавить в classpath.

Это может быть полезно, когда вы не знакомы с Gradle или Maven и просто для локальной разработки.

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

С помощью этой опции вы можете сгенерировать проект без Maven/Gradle в вашей IDE, который содержит все необходимые файлы. В IntelliJ IDEA вы можете просто перейти на:

File > New > Project > JavaFX

Дополнительное чтение


Hello World JavaFX application source code — Gradle
Hello World JavaFX application source code — Maven
JavaFX 13 and IntelliJ
JavaFX 13 and NetBeans
JavaFX 13 and Eclipse

Что дальше


Эта статья является первой в серии JavaFX. В следующей мы расскажем, как создать и запустить ваше самое первое приложение JavaFX.

Комментарии (25)


  1. Terras
    02.11.2019 19:25
    -1

    Его реально кто-то юзает сейчас? Просто технология выглядела мертворожденной.


    1. fougasse
      03.11.2019 21:11
      +1

      Используем, прямо сейчас.
      Как заменили Swing — так продолжаем.
      Вашу альтернативу UI для толстого клиента на JVM можно узнать?


      1. bugy
        03.11.2019 21:43

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


        В прошлой компании я поработал полгода с Java FX, и не назвал бы этот опыт строго положительным. Есть много плюсов по сравнению со Swing (bindings, "css", получше выглядит), но в целом помедленнее, побольше багов и некоторые вещи тяжело кастомизируются.
        И, при возможности, я бы для проектов выбирал всякие электроны для десктопов, чем java FX. По крайней мере с точки зрения скорости и удобства разработки.


        Разумеется, такой выбор не всегда возможен.


        1. fougasse
          03.11.2019 21:51

          1. Потому, что продукт уже был, и логику переоводить на js смысла не имело никакого, и никто за это не заплатит
          2. Т.к нет фронтендеров, и нанимать их не планируется
          3. Ну и web интерфейс тоже есть, отдельно, попроще, для желающих


          1. bugy
            03.11.2019 22:50

            Понятно, спасибо!


      1. ukt
        03.11.2019 01:03

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


        1. foatto
          06.11.2019 09:13
          +1

          + Никакая поддержка видео в свинге. Точнее, она как бы есть, но через включаемый кусочек FX'a. После некоторых мытарств переписал клиента на FX полностью.
          + Удобный TableLayout (если я правильно вспомнил название) в FX'e. Заменил им грид свинга и родной грид самого FX'a. Через него же стало удобнее генерировать формочки ввода/редактирования.
          + Для векторной картографии и графиков удобно использовать Shape в FX, чем рисовать самому в Canvas'e
          — Как-то баговато там с focus'ами, работало через раз.
          — Свинговый клиент работает быстрее FX'ового, клиенты складской проги упорно сидят на старой версии.

          В конце концов у меня перестало хватать времени на поддержку настольной и андроид версий и я перешёл на Kotlin/JS + Vue.js.
          Вы не поверите, но кода стало меньше. Без особых мучений перетащил функционал (поддержка видео пока в процессе).
          Истины ради скажу, что работать стало ещё чуток медленнее, но пока достаточно.
          Ну и до кучи за счёт «вебнутости» получил ios-клиентов.


        1. dporollo
          06.11.2019 09:37
          +1

          Тупо не современный, и выглядит просто страшно.


          1. val6852 Автор
            06.11.2019 09:38

            Согласен, если речь о свинге.


      1. SnowBearRu
        06.11.2019 09:32

        От продукта конечно зависит, но как вариант, в свое время, рассматривал netbeans как скелет приложения ( можно и eclipse ) и функционал наращивать уже на его ядре.



  1. MAXH0
    02.11.2019 19:28
    -1

    Аналогичный вопрос. Он еще жив? Где применяется?


    1. fougasse
      03.11.2019 21:17

      Для UI в толстых десктопных клиентах на Kotlin, например.
      Расскажите про альтернативу, всем будет интересно.


      1. Terras
        03.11.2019 15:19

        Сейчас идет так:

        1) Тебе нужное какое-то приложение для обработки бизнес-логики (делай веб-морду или делай электрон). Работает электрон не самым легким способом, конечно, но идет постепенно прогресс и улучшения.

        2) Нужны какие-то серьезные и тяжелые приложения на машине (Аля ворд, фотошоп, adope premier итд) — добро пожаловать в мир C++.

        Сам Майкрософт фактически на последней конференции заявил, что они не планируют развивать классический десктоп (windows forms/WPF/UWP), и будут полагаться на электрон приложения.

        __

        Что касается Java мира, то достаточно популярен Swing, который имеет за собой такого монстра, как JetBrains (которые просто уже не могут с него слезть на что-то другое и поддерживают и развивают).

        А Вот JavaFX — это поделка, которая должна была дать бой UWP, но фактически вышла, когда уже в ней не было особого смысла. И Оракл достаточно быстро выбросил его на улицу в опенсорс.

        Т.е. Swing хотя бы надежен и кем-то поддерживается, когда JavaFX…


        1. fougasse
          03.11.2019 18:44

          С таким же успехом можно сказать, что Оракл и остальное выбросил в опенсорц, т.к. всегда была openjdk.
          И что там с поддержкой FX не так, я не очень понимаю, если честно.
          Оно работает не хуже Swing, всяко не студенческая поделка.
          Да, есть интересные места, особенно если начинать косо-криво городить свои компоненты, но и тогда их всегда можно обойти.


        1. sshikov
          04.11.2019 20:45

          >Сейчас идет так:
          А можно узнать, сколько у вас лично опыта применения? Судя по постам, вы вообще к миру Java не имели отношения.


        1. striver
          06.11.2019 12:14

          Т.е. Swing хотя бы надежен и кем-то поддерживается, когда JavaFX…
          Ну, FX уже лет 7 не пилится, по сравнению со всем остальным, поэтому кажется, что подделка. У Джавы другие задачи, и интерфейс — как исключение, вот и забили. А жаль.


      1. loki82
        03.11.2019 20:33

        Хотелось бы подробностей. Для меня Ява в десктопе закончилась на томкат. Что даёт котлин, и как это в исполняемый файл упаковывается? Ищу что нибудь что буду понимать. QT не дался.


        1. fougasse
          03.11.2019 21:07

          В какой исполняемый файл, там такой же .jar.
          Для запуска нужно использовать JVM.
          Если позволяют средства — есть инсталляторы, которые систему не замусоривают и можно иметь для каждой версии свою версию ява-машины.
          Есть еще грааль, но UI я с ним не щупал, там прямо native получается.


          1. loki82
            03.11.2019 21:18

            Искал решение которое решит все мои проблемы. Жаль что не так. Чуточку поясню. Хочу сделать некую экосистему с заменой 1с в рознице. Не бухгалтерию, а именно оперативную область. Для начала решил сделать приложение ТСД, второй частью заменить место кассира, третьей оперативную часть с CRM. И потом и бэк.


  1. oldd
    03.11.2019 21:13

    Ещё как жив, и применяется, как ни странно, на десктопе)) Просто есть места, где программа должна быть кросплатформенной, без браузера и достаточно простая в установке как сервера, так и клиента. Мне лично достаточно удобно писать на kotlin + exposed + tornadofx, разработка быстрая и удобная.
    Но свистопляска с версиями java и javafx напрягает — где то можно на java поставить javafx, а где-то не ставится, где-то можно собрать бинарник, а где-то ругается на отсутствующие части java


    1. fougasse
      03.11.2019 21:23

      openjdk решает проблемы, не так ли?
      Ну и инсталлятор типа install4j никто не отменял.


      1. oldd
        03.11.2019 21:28

        1) openjdk не решает проблемы, потому как полгода назад javafx 13 не работала вместе с openjdk. Сейчас не знаю, работаю на Liberica, там javafx встроена
        2) А install4j не работает, потому как «в энтой версии джавы нету fx:deploy»
        В общем и целом, надо потратить время и разобраться, но времени нету. С сожалением вспоминаю времена, когда в delphi нажал F9, и через 10 сек бинарник готов…


        1. fougasse
          03.11.2019 21:31

          Ну, есть еще zulu, но, возможно, в мире Java реально нужно постоянно на свеженьких версиях сидеть, чего не требуется для Котлина.


  1. striver
    06.11.2019 12:43

    Да, было дело, нарисовал себе приложение, по подсказке знакомого на SWINGe, потом допилил для работы, а в начале этого года решил перерисовать на FX, думал, что получится очень быстро. Но, не всё так быстро, как бы хотелось. Да, функционал не сравнить, но жрет больше. Да и глаз радует больше, чем даже фил энд лук МакОС. Но это так, вкусовщина.
    fougasse
    Смотрю у вас много опыта на JavaFX, у меня есть несколько вопросов, если позволите. Работали ли с alias'ами? В сети даже близко не нашел ответов, да и на Тостере тоже не ответили. В табличке по условию нужен цвет, но было 2 попытки, не получилось и забил. Не сильно критично, но визуал очень помогает.