Javafx — Swing -> JavaFX


Содержание

Swing vs JavaFx для настольных приложений

151 Quillion [2013-05-22 17:49:00]

У меня очень большая программа, которая в настоящее время использует SWT. Программа может работать как на Windows, Mac и Linux, так и на большом настольном приложении со многими элементами. Теперь, когда SWT был несколько старым, я хотел бы переключиться на Swing или JavaFX. И я хотел бы услышать ваши мысли о трех вещах.

Моя главная проблема заключается в том, что будет лучше для настольного GUI-приложения? (Я смотрел онлайн, и многие люди предполагают, что JavaFX так же хорош, как Swing, но я не видел много действительных аргументов, кроме простых пламенных войн). Он должен работать как на Windows, Mac, так и на некоторых популярных дистрибутивах Linux.

Что будет чище и проще в обслуживании?

и что будет быстрее строить с нуля?

Я использую методологию MVC в своем приложении, если это поможет.

java user-interface swing javafx swingx

7 ответов

127 Решение berry120 [2013-05-22 18:00:00]

Что будет чище и проще в обслуживании?

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

И что будет быстрее строить с нуля?

В значительной степени зависит от того, что вы строите. У Swing есть больше компонентов для него (сторонний, а также встроенный), и не все из них добрались до новой платформы JavaFX, поэтому может возникнуть определенное количество повторного создания колеса, если вам нужно что-то бит. С другой стороны, если вы хотите делать переходы/анимации/видеоматериалы, то это на порядок легче в FX.

Еще одна вещь, о которой нужно помнить, — это (возможно) внешний вид. Если вы абсолютно должны иметь внешний вид системы по умолчанию, тогда JavaFX (в настоящее время) не может этого предоставить. Не для меня большой размер (я предпочитаю, чтобы FX выглядел по-умолчанию), но я знаю, что некоторые политики требуют ограничения на стили системы.

Лично я вижу, что JavaFX — это «уже существующая» библиотека пользовательского интерфейса, которая еще не совсем там (но более чем годна к употреблению), и Swing в качестве библиотеки интерфейса границы с устаревшим интерфейсом, которая в настоящее время полностью поддерживается и поддерживается, но, вероятно, выиграла так будет в ближайшие годы (и, следовательно, вероятность того, что FX настигнет его в какой-то момент.)

Как заявлено Oracle, JavaFX является следующим шагом в их богатой клиентской стратегии на основе Java. Соответственно, это то, что я рекомендую для вашей ситуации:

Что было бы проще и чище поддерживать

  • JavaFX ввел несколько улучшений по сравнению с Swing, например, возможность разметки пользовательских интерфейсов с помощью FXML и тематику с помощью CSS. Он имеет большой потенциал для написания модульного, чистого и поддерживаемого кода.

Что будет быстрее строить с нуля

  • Это сильно зависит от ваших навыков и инструментов, которые вы используете.
    • Для качания различные IDE предлагают инструменты для быстрого развития. Лучшее, что я лично нашел, — это GUI-конструктор в NetBeans.
    • JavaFX также поддерживает различные IDE, хотя и не настолько зрелые, как поддержка Swing на данный момент. Однако его поддержка разметки в FXML и CSS делает разработку графического интерфейса на JavaFX более быстрой и интуитивно понятной.

Поддержка шаблонов MVC

  • JavaFX очень дружелюбен к шаблону MVC, и вы можете чисто отделить свою работу от: презентации (FXML, CSS), моделей (Java, объектов домена) и логики (Java).
  • IMHO, поддержка MVC в Swing не очень привлекательна. Поток, который вы увидите по различным компонентам, не соответствует последовательности.

Для получения дополнительной информации, пожалуйста, просмотрите эту часто задаваемую статью Oracle относительно JavaFX здесь.

19 Joop Eggen [2013-05-22 18:06:00]

Я использую javafx в первый раз в некоммерческом развлекательном приложении, и там все в порядке. У него нет качества продукции IMHO.

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

С другой стороны, есть приятные эффекты и дополнения, такие как HTMLEditor. Переключение языка приложения проще (просто перестройте сцену). В Java 8 javafx должен быть более pallatable (обратные вызовы) и созрел.

Если вы не можете ждать, пойдите для качания. Он прочный. Вы можете выбрать платформу RBC NetBeans, но это требует обучения или коммерческой поддержки. Усилия по переносу части платформы NetBeans на javafx, также в гибридной версии.

И последнее, но не менее важное: можно комбинировать оба, запускать javafx внутри приложения swing.

Добавление Вышеуказанный ответ был 22 мая 2013 года. В настоящее время JavaFX готов к производству.

Никто не упомянул об этом, но JavaFX не компилирует или не запускает определенные архитектуры, которые Oracle называют «серверами» (например, Solaris) из-за отсутствия поддержки «jfxrt.jar». Stick с SWT, до дальнейшего уведомления.

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

Кроме того, SWT фактически более новый и более активно поддерживается, чем Swing. (Первоначально он был в качестве замены Swing с использованием собственных компонентов).

Я бы посмотрел вокруг, чтобы найти некоторые (сторонние?) компоненты, которые делают то, что вы хотите. Мне нужно было создать пользовательские компоненты Swing для представления в режиме повестки дня, где вы можете заказать несколько ресурсов, а также подобную Excel сетку, которая хорошо работает с клавиатурной навигацией и так далее. У меня было страшное время заставить их работать хорошо, потому что мне нужно было вникать во многие из Swing многих сложностей, когда я сталкивался с проблемой. Мышь и фокусное поведение, а также многое другое может быть очень трудно получить, особенно для обычного пользователя Swing. Я надеюсь, что JavaFX немного более ориентирован на будущее и будет сглажен.

В старых ноутбуках со встроенным видеороликом приложение Swing запускается и работает намного быстрее, чем приложение JavaFX. Что касается разработки, я бы рекомендовал переключиться на Scala — сопоставимое Scala Приложение Swing содержит в 2,3 раза меньше кода, чем Java. Что касается Swing vs SWT: графический интерфейс Netbeans значительно быстрее, чем Eclipse.

Swing -> JavaFX, как создавать графические приложения с помощью JavaFX

Некоторое время назад я написал заявление в Java с помощью Качели для разработки GUI. Как я хочу, чтобы узнать больше о JavaFX Я пытаюсь преобразовать его, но я застревают на одной части моего заявления я не могу найти правильный эквивалент в JavaFX. В Swing я был в состоянии сделать JPanel, создать образ, а затем масштабировать изображение на основе размера JPanel с использованием компонентных событий на панели. Тогда я бы рисовать вещи на изображение и рисовать, что на графике в JPanel. Кроме того, я хотел бы использовать событие мыши на JPanel осуществлять масштабирование и панорамирование на базовом изображении.

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

Что было бы лучшим способом пойти об этом в JavaFX? Я смотрел тонны учебников и YouTube видео, но все они, кажется, сосредоточиться только на обычных элементах управления с графическим интерфейсом типа кнопок, и когда я смотрю на игру разработчик, например, они делают много использования стандартного JavaFX узлов быстро генерировать двигающиеся объекты в своей сцене. Мне просто нужно своего рода холст, чтобы вынести вещи на, как мне нравится, но если добавить что-то вроде Canvas по умолчанию или области в Scene Builder для моего файла FXML я не знаю, как начать рисовать на этом. Я полностью потерял в джунглях учебных пособий и документации в Интернете.

Кто-нибудь знает любой хороший ресурс для такого рода приложений потому что я просто не знаю, с чего начать.

Введение в Java FX

Что такое Java FX

JavaFX представляет инструментарий для создания кроссплатформенных графических приложений на платформе Java.

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

С помощью JavaFX можно создавать программы для различных операционных систем: Windows, MacOS, Linux и для самых различных устройств: десктопы, смартфоны, планшеты, встроенные устройства, ТВ. Приложение на JavaFX будет работать везде, где установлена исполняемая среда Java (JRE).

JavaFX предоставляет большие возможности по сравнению с рядом других подобных платформ, в частности, по сравнению со Swing. Это и большой набор элементов управления, и возможности по работе с мультимедиа, двухмерной и трехмерной графикой, декларативный способ описания интерфейса с помощью языка разметки FXML, возможность стилизации интерфейса с помощью CSS, интеграция со Swing и многое другое.

История JavaFX фактически началась в первой половине 2000-х годов, когда разработчик по имени Крис Оливер (Chris Oliver), будучи работником компании SeeBeyond, разработал для создания графических интерфейсов новый язык F3 (Froms Follows Functions). Впоследствии в 2005 году SeeBeyond была приобретена компанией Sun Microsystems (которая на тот момент развивала язык Java до покупки компанией Oracle). F3 был переименован в JavaFX, а Крис Оливер продолжил работу над новой платформой уже в рамках компании Sun. И в мае 2007 года Sun Microsystems публично анонсировала новую платформу для создания графических приложений. А 4 декабря 2008 года вышел JavaFX 1.0 SDK.

После приобретения Sun Microsystems компанией Oracle в 2010 году была анонсирована, а в 2011 году вышла в релиз версия JavaFX 2.0. В первой версии JavaFX фактически представлял скиптовый язык. Во второй версии был полностью изменен подход. Скриптовый язык был убран, а платформа была полностью переписана фактически с нуля. Теперь создавать приложения можно было с помощью любого языка, который поддерживала JVM. Были добавлены новые API, интеграция со Swing и много других вещей.

Следующими важными вехами в развитии платформы стали версии JavaFX 8 и особенно JavaFX 9, которая вышла в сентябре 2020 года вместе с Java 9 и привнесла в платформу модульность. И если раньше JavaFX поставлялась вместе с Java SE, то сейчас JavaFX отделена от основной функциональности Java SE и используется как отдельный модуль. Последняя версия фреймворка — JavaFX 12 — вышла в марте 2020 года.

На данный момент JavaFX представляет предпочтительный способ для создания графических приложений с помощью языка Java, который пришел на смену AWT и Swing. Также стоит отметить, что для работы с JavaFX вместо Java теоретически можно использовать любой язык программирования, который поддерживается JVM.

Установка инструментария

Что необходимо для работы с JavaFX? Прежде всего необходимо установить последнюю версию JDK с официального сайта Oracle: http://www.oracle.com/technetwork/java/javase/downloads/index.html. Желтельно установить также последнюю 12-ю версию Java, хотя, согласно документации, можно использовать и 11 JDK.

И даже после установки 12-й версии важно убедиться, что именно она и будет использоваться. В частности, системная переменная JAVA_HOME должна хранить путь к папке bin SDK 12-й версии.

Проверить, какая версия Java используется на глобальном уровне, можно выполнив в консоли/командной строке команду:

Если отображается 11 или более низшая версия, то необходимо просмотреть системные переменные среды, которые могут использовать другую версию java вместо java 12.


JavaFX SDK

Также необходимо загрузитьJavaFX SDK с адреса https://gluonhq.com/products/javafx/.

Например, если ос Windows, то соответственно надо загрузить JavaFX Windows SDK. По сути SDK представляет архив с файлами, и после его загрузки его необходимо распаковать в любое предпочтительное место на жестком диске. Например, в моем случае SDK распакован в папку C:\javafx-sdk .

Модули JavaFX

Если мы откроем папку lib в распакованном SDK, то мы увидим там модули, которые собственно и представляют JavaFX.

При написании кода приложений, а также при их компиляции и запуске мы будем использовать эти модули. Что они делают:

Записки программиста

Краткий обзор GUI-фреймворков для Java и мое первое простенькое GUI-приложение на Swing

Так исторически сложилось, что с UI мне приходилось работать очень мало. Видимо, поэтому мне так интересные всякие там Qt и wxW >

Ситуация с GUI фреймворками в мире Java несколько запутанная. Насколько я смог разобраться, дела обстоят следующим образом.

  • AWT (Abstract Window Toolkit) был первым GUI фреймворком. Идея была правильная — AWT использует нативные контролы, то есть, они выглядят и физически являются родными, независимо от того, где вы запускаете свое приложение. К сожалению, оказалось, что (1) общих для различных окружений контролов мало и (2) писать кроссплатформенные нативные интерфейсы так, чтобы ничего не поползло и не разъехалось, очень сложно;
  • Поэтому на смену AWT пришел Swing. Swing использует формочки, создаваемые AWT, на которых он своими силами рисует контролы. Работает это хозяйство, понятно дело, медленнее, но зато UI становится намного более портабельным. Swing предлагает на выбор программисту множество Look&Feel, благодаря которым можно сделать либо так, чтобы приложение выглядело и вело себя одинаково как под Windows, так и под Linux, либо чтобы приложение было очень похоже на нативное независимо от того, где его запускают. В первом случае приложение проще отлаживать, во втором — становятся счастливее пользователи. Кстати, изначально Swing был сделан парнями из Netscape;
  • SWT (Standard W >всех-всех-всех платформ, и тогда приложение вроде как даже станет портабельным, но только до тех пор, пока не появится какая-нибудь новая операционная система или архитектура процессора;
  • JavaFX активно пилится в Oracle и позиционируется, как скорая замена Swing. Идеологически JavaFX похож на Swing, то есть, контролы не нативные. Среди интересных особенностей JavaFX следует отметить хардверное ускорение, создание GUI при помощи CSS и XML (FXML), возможность использовать контролы JavaFX’а в Swing’е, а также кучу новых красивых контролов, в том числе для рисования диаграмм и 3D. Видео с более детальным обзором JavaFX можно посмотреть здесь. Начиная с Java 7, JavaFX является частью JRE/JDK;
  • NetBeans Platform (не путать с NetBeans IDE!) — это такая штука, которая, как я понял, работает поверх Swing и JavaFX, предоставляет как бы более удобный интерфейс для работы с ними, а также всякие дополнительные контролы. В одном приложении, использующем NetBeans Platform, я видел возможность перетаскивать вкладки drug&drop’ом, располагая панели в окне подобно тому, как это делают тайловые оконные менеджеры. По всей видимости, сам Swing так не умеет. Почитать про NetBeans Platform поподробнее можно здесь;
Цукерберг рекомендует:  Простые правила хорошего кода

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

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

Наше приложение будет выглядеть следующим образом под Ubuntu:

А так оно будет выглядеть при запуске под Windows:

Как видите, JRE под Windows и Linux включают в себя разный набор L&F. Кроме того, вы можете подключить сторонний Look&Feel или даже написать свой. По умолчанию используется L&F Metal, который во всех ОС и оконных менеджерах выглядит более-менее одинаково. Если вам больше нравятся круглые кнопочки, то вместо Metal можно использовать Look&Feel Nimbus. Если вам хочется, чтобы приложение было похоже на нативное, то под Linux следует выбрать L&F GTK+ (интересно, а если пользователь сидит под KDE?), а под Windows — L&F Windows. Неплохой идеей, видимо, будет предусмотреть в вашей программе возможность переключаться между различными L&F. С другой стороны, при этом придется тестировать работу приложения со всеми этими L&F.

Давайте посмотрим на исходный код приложения. Коллеги UI-щики заверили меня, что никаких WYSIWYG редакторов они не используют, а если используют, то разве что для быстрого прототипирования. Из неплохих WYSIWYG редакторов назывался JFormDesigner. Говорят, генерируемый им код даже похож на код, написанный человеком, а не адовую().последовательность().вызовов().методов(). В общем, весь код писался лапками в IntelliJ IDEA.

В Swing и AWT, если мы хотим что-то поменять в UI, мы должны делать это из event dispatching thread. Статический метод invokeLater принимает класс, реализующий интерфейс Runnable, и вызывает его метод run() внутри event dispatching thread. Если вам не знаком приведенный выше синтаксис, то это такой способ в Java объявить класс, не присваивая ему имени. Классы без имени называются анонимными. Часто анонимные классы в Java выполняют ту же роль, что играют лямда-фукнции в функциональных языках программирования. Помимо прочего, поддерживаются и замыкания. Интересно, что, в отличие от лямбд, анонимные классы в Java позволяют передать сразу пачку методов. Притом, при помощи наследования и абстрактных классов, для всех или части методов можно взять их реализацию по умолчанию.

Аннотация @Override проверяет, что метод run() действительно переопределит метод интерфейса Runnable. Без нее при переопределении метода мы можем случайно сделать опечатку и определить новый метод вместо того, чтобы переопределить существующий. Впрочем, в данном конкретном случае аннотация, видимо, не очень полезна, и, наверное, даже является лишней.

В итоге event dispatching thread вызовет метод createGUI(), полный код которого следующий:

private static void createGUI ( ) <
JList String > list = new JList <> ( ) ;
list. setSelectionMode ( ListSelectionModel . SINGLE_SELECTION ) ;

JScrollPane listScrollPane = new JScrollPane ( list ) ;

JPanel topPanel = new JPanel ( ) ;
topPanel. setLayout ( new BorderLayout ( ) ) ;
topPanel. add ( listScrollPane, BorderLayout . CENTER ) ;

ActionListener updateButtonListener = new UpdateListAction ( list ) ;
updateButtonListener. actionPerformed (
new ActionEvent ( list, ActionEvent . ACTION_PERFORMED , null )
) ;

JButton updateListButton = new JButton ( «Update list» ) ;
JButton updateLookAndFeelButton = new JButton ( «Update Look&Feel» ) ;

JPanel btnPannel = new JPanel ( ) ;
btnPannel. setLayout ( new BoxLayout ( btnPannel, BoxLayout . LINE_AXIS ) ) ;
btnPannel. add ( updateListButton ) ;
btnPannel. add ( Box . createHorizontalStrut ( 5 ) ) ;
btnPannel. add ( updateLookAndFeelButton ) ;

JPanel bottomPanel = new JPanel ( ) ;
bottomPanel. add ( btnPannel ) ;

JPanel panel = new JPanel ( ) ;
panel. setBorder ( BorderFactory . createEmptyBorder ( 5 , 5 , 5 , 5 ) ) ;
panel. setLayout ( new BorderLayout ( ) ) ;
panel. add ( topPanel, BorderLayout . CENTER ) ;
panel. add ( bottomPanel, BorderLayout . SOUTH ) ;

JFrame frame = new JFrame ( «Look&Feel Switcher» ) ;
frame. setMinimumSize ( new Dimension ( 300 , 200 ) ) ;
frame. setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE ) ;
frame. add ( panel ) ;
frame. pack ( ) ;
frame. setVisible ( true ) ;

updateListButton. addActionListener ( updateButtonListener ) ;
updateLookAndFeelButton. addActionListener (
new UpdateLookAndFeelAction ( frame, list )
) ;
>

Тут, в общем-то, нет ничего супер сложного. Создаются кнопки, список, список заворачивается в JScrollPane, чтобы у списка была прокрутка. Элементы управления располагаются во фрейме при помощи панелей. Панели могут иметь различные лайоуты, здесь мы использовали BorderLayout и BoxLayout. Принцип аналогичен тому, что используется в wxWidgets.

Для реакции на различные события, например, нажатия кнопок, используются классы, реализующие интерфейс ActionListener. В приведенном выше коде используется два таких класса — UpdateListAction и UpdateLookAndFeelAction. Как нетрудно догадаться по названию, первый класс отвечает за обработку нажатий на левую кнопку «Update list», второй — на правую кнопку «Update Look&Feel». ActionListener’ы привязываются к кнопкам при помощи метода addActionListener. Поскольку сразу после запуска приложения нам хочется увидеть список доступных Look&Feel, мы эмулируем нажатие на кнопку «Update list». Для этого мы создаем экземпляр класса ActionEvent и передаем его в качестве аргумента методу actionPerformed класса UpdateListAction.

Реализация класса UpdateListAction следующая:

static class UpdateListAction implements ActionListener <
private JList String > list ;

public UpdateListAction ( JList String > list ) <
this . list = list ;
>

@Override
public void actionPerformed ( ActionEvent event ) <
ArrayList String > lookAndFeelList = new ArrayList <> ( ) ;
UIManager. LookAndFeelInfo [ ] infoArray =
UIManager . getInstalledLookAndFeels ( ) ;
int lookAndFeelIndex = 0 ;
int currentLookAndFeelIndex = 0 ;
String currentLookAndFeel >=
UIManager . getLookAndFeel ( ) . getClass ( ) . getName ( ) ;

for ( UIManager. LookAndFeelInfo info : infoArray ) <
if ( info. getClassName ( ) . equals ( currentLookAndFeel >) ) <
currentLookAndFeelIndex = lookAndFeelIndex ;
>
lookAndFeelList. add ( info. getName ( ) ) ;
lookAndFeelIndex ++;
>

String [ ] listDataArray = new String [ lookAndFeelList. size ( ) ] ;
final String [ ] newListData =
lookAndFeelList. toArray ( listDataArray ) ;
final int newSelectedIndex = currentLookAndFeelIndex ;

SwingUtilities . invokeLater ( new Runnable ( ) <
@Override
public void run ( ) <
list. setListData ( newListData ) ;
list. setSelectedIndex ( newSelectedIndex ) ;
>
> ) ;
>
>

В конструкторе передается указатель на список, в котором мы будет отображать доступные Look&Feel. На самом деле, поскольку UpdateListAction является вложенным классом нашего основного класса LookAndFeelSwitcher, у него есть возможность обращаться напрямую к полям создавшего его экземпляра LookAndFeelSwitcher. Но функциональщик внутри меня сопротивляется такому подходу, поэтому я решил передать ссылку на список явно через конструктор.

Метод actionPerformed будет вызываться при нажатии на кнопку. Код этого метода довольно тривиален — мы просто используем статические методы класса UIManager для получения списка доступных Look&Feel, а также определения текущего Look&Feel. Затем обновляется содержимое списка и выбранный в нем элемент. Тут нужно обратить внимание на два момента. Во-первых, каждый Look&Feel имеет имя и имя класса, это разные вещи. Пользователю мы должны показывать имена, а при переключении Look&Feel использовать имя класса. Во-вторых, обратите внимание на то, как создаются final переменные newListData и newSelectedIndex, которые затем используются в анонимном классе. Это и есть тот самый аналог замыканий, речь о котором шла ранее. Очевидно, использование не final переменных в замыканиях привело бы к печальным последствиям.

Наконец, рассмотрим класс UpdateLookAndFeelAction:

static class UpdateLookAndFeelAction implements ActionListener <
private JList String > list ;
private JFrame rootFrame ;

public UpdateLookAndFeelAction ( JFrame frame, JList String > list ) <
this . rootFrame = frame ;
this . list = list ;
>

@Override
public void actionPerformed ( ActionEvent e ) <
String lookAndFeelName = list. getSelectedValue ( ) ;
UIManager. LookAndFeelInfo [ ] infoArray =
UIManager . getInstalledLookAndFeels ( ) ;

for ( UIManager. LookAndFeelInfo info : infoArray ) <
if ( info. getName ( ) . equals ( lookAndFeelName ) ) <
String message = «Look&feel was changed to » + lookAndFeelName ;
try <
UIManager . setLookAndFeel ( info. getClassName ( ) ) ;
SwingUtilities . updateComponentTreeUI ( rootFrame ) ;
> catch ( ClassNotFoundException e1 ) <
message = «Error: » + info. getClassName ( ) + » not found» ;
> catch ( InstantiationException e1 ) <
message = «Error: instantiation exception» ;
> catch ( IllegalAccessException e1 ) <
message = «Error: illegal access» ;
> catch ( UnsupportedLookAndFeelException e1 ) <
message = «Error: unsupported look and feel» ;
>
JOptionPane . showMessageDialog ( null , message ) ;
break ;
>
>
>
>

Здесь мы просто (1) находим L&F с именем, равным имени, выбранному в списке, (2) меняем L&F при помощи static метода setLookAndFeel класса UIManager и (3) перерисовываем главный фрейм нашего UI, а также, рекурсивно, расположенные на нем элементы, при помощи static метода updateComponentTreeUI класса SwingUtilities. Наконец, мы уведомляем пользователя при помощи сообщения, все ли прошло успешно.

Также хотелось бы сказать пару слов об отладке GUI-приложений на Java, и не только GUI. Во-первых, в Swing есть такое волшебное сочетание клавиш Ctr + Shift + F1, которое выводит в stdout информацию о том, как расположены контролы. Очень полезно, если хочется слизать UI у конкурентов. Во-вторых, есть такой интересный хоткей Ctr + \. Если нажать его в консоли работающего приложения на Java, будут выведены все нитки и их стектрейсы. Удобно, если вы словили дэдлок. Наконец, в-третьих, во время разработки GUI бывает полезно разукрасить панели в разные цвета. Сделать это можно так:

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

10 Differences between JavaFX and Swing

JavaFX For Dummies

If you’re an experienced Java programmer, you have undoubtedly worked with Swing to create user interfaces. Oracle hasn’t completely abandoned Swing — it isn’t deprecated, and Swing applications continue to work. But no work is being done anymore to enhance Swing, and Oracle has made it clear that JavaFX is the future.

Here are ten basic differences between JavaFX and Swing.

In JavaFX, all the world’s a stage

In Swing, the >JFrame >JPanel class.

A Swing application is actually a >JFrame >JPanel and then add the panel to the frame.

JavaFX uses the metaphor of a theater to model the top-level containers of an application. A stage (defined by the Stage >Scene class). An application can have more than one scene, but only one of the scenes can be displayed on the stage at any given time.

A scene contains a scene graph, which is the most important concept in JavaFX. The scene graph is a collection of all the elements that make up a user interface — groups, layouts, controls, and shapes. These objects are called nodes and are all derived from the Node >Node >Node >setRotate method that allows you to rotate any node in the scene graph.

In JavaFX, layout managers are nodes

In Swing, a layout is associated with a JPanel . The top-level JPanel gives the basic layout for the frame. If you want to nest additional layouts within the top-level layout, you must create additional JPanels , set their associated layouts, and then add them to the higher-level layout.

In JavaFX, layouts are sub >Node class just like controls and shapes. Layouts contain a collection of nodes, and any node contained in a layout can be any kind of node: a control, a shape, or another layout. This scheme is much less cumbersome than Swing’s association of layouts with panels.

JavaFX has improved event handling

Both JavaFX and Swing use event handling to respond to user input events. However, you will find that events in JavaFX are better thought-out and more consistent than their equivalents in Swing. But the biggest reason event handling is improved in JavaFX is because of its reliance on properties.


JavaFX supports properties

JavaFX supports the concepts of properties and uses properties extensively throughout its classes. Simply put, a property is a variable whose value can be observed. You can register a listener with any property, allowing you to write code that’s triggered automatically whenever the property changes. In addition, you can bind properties to each other, meaning that if one property value changes, the other property value automatically changes with it.

Because nearly all characteristics of user-interface elements are managed through properties, JavaFX provides event handling that’s unheard of in Swing. For example, in JavaFX, you can attach an event listener to the color of a shape. If the shape changes color, your event listener code is executed. You may not have a use for the capability, but you can use it if you need to.

JavaFX is skinnable with CSS

One of the best features of JavaFX is that you can control formatting with Cascading Style Sheets (CSS). Just about every aspect of the appearance of your user interface can be set by a style rule, and you can easily allow the user to select which of several available style sheets to apply to the scene. Thus, you can change the entire appearance of your application with a single method call.

JavaFX has more consistent controls

In general, you’ll find that the JavaFX control hierarchy is more complete than Swing’s. Both have all the basic controls — buttons, check boxes, combo boxes, and the like. But JavaFX has several interesting controls that Swing doesn’t have, such as the collapsible TitledPane control and the Accordion control that arranges multiple TitledPane controls in a stack. And the fact that all these controls are skinnable by CSS gives them a huge advantage over Swing.

JavaFX has special effects

The javafx.scene.effect package contains a number of classes that can easily apply special effects to any node in the scene graph. These classes let you easily apply shadows, reflections, blurs, and other interesting visual effects that can transform the appearance of your user interface.

Цукерберг рекомендует:  Эффект предварительной загрузки страницы

Animation is easier in JavaFX

Animation is possible in Swing, but Swing does not provide any direct support for it. To animate a Swing component, you must set up your own timers and build your own logic to perform the animation.

In contrast, JavaFX has built-in support for sophisticated animations that can be applied to any node in the scene graph. You can use one of several built-in transition >KeyFrame and Timeline classes to easily set up custom animations.

JavaFX supports modern touch devices

Swing lacks any support for modern touch devices. In contrast, JavaFX has built-in support for common touch gestures such as scrolling, swiping, rotating, and zooming. Handling these events in JavaFX is as easy as handling any other type of event: You simply install an event listener on the touch event and then write code that responds appropriately.

JavaFX has no equivalent to JOptionPane

It wouldn’t be fair to completely fill this list of ten differences with points that clearly favor JavaFX. Here’s one minor annoyance of JavaFX: It has no built-in equivalent to Swing’s JOptionpane class, which is very handy for displaying short alert messages or getting simple input from the user. In JavaFX, you have to craft your own equivalent to this useful class.

Why I’m so excited about migrating from Swing to JavaFX 2

Yep, another article on JavaFX

Ok, I know what you’re thinking: “Oh, another JavaFX technical article”. You’re right. This is an article about how JavaFX is the best thing since bacon-wrapped Ferraris.

I’ve been thinking recently about what JavaFX brought to me as developer, and earlier this year I gave a presentation at MarsJUG in Marseille and FinistJUG in Brest on the topic (see the slides above). See, I come from the Java EE world, meaning I do a lot of EJBs, JPA and so on. But also a lot of JSF. Years ago, I also did Swing development, and even managed to enjoy it most of the time. So I have to deal with core/business classes but also with UI and UX.

I got seduced by JavaFX 2 at Devoxx France 2012 I went to a presentation by guys from Oracle. I was very disappointed by JavaFX 1 but I decided to give it a try.

I decided to develop an app to test JavaFX 2 and I discovered that it covers a lot of concepts from JEE: the binding, the controllers. But also concepts brought by Qt years ago: building a UI with an XML file. For me it is the really first time we can do real MVC for Java desktop apps. It was very freeing for a guy like me, who is normally pretty strict with architectures. When you’re playing with all of this, it is very convenient and natural (even if you have to forget your old Swing tricks).

Why should you bother with JavaFX?

You may ask “Why trying something else to create UI, and why JavaFX?”. That’s a great question. First of all, I’m always looking for new technologies to be up to date in terms of knowledge. I also strongly believe in desktop apps. Nowadays, everyone is talking about web technologies (Angular.js, jQuery, etc) probably because everyone is disappointed with desktop app development; but I don’t think desktop apps are dead. Historically in Java it was difficult to quickly create a sexy UI in Swing, which is a problem by itself. Users want apps quickly, and it is here where my passion for JavaFX started.

The way of developing software changes. Developers change. Languages change. Practices change. So it goes for Java. For more than a decade, we used Swing in order to create our UIs, with all the difficulties it implies. The way of creating UIs had to change in order to be easier and more flexible, which is exactly where JavaFX brings some new fresh air to the world of Java desktop development.

What sucked about Swing that JavaFX improves

Using Java classes for modeling and creating a UI is not really MVC-oriented. In Swing, you often create a class that extends JFrame in order to create your view. And then you add all possible controls your UI will need.

What you may also do is use your IDE (with some plugins) to create your UI by dragging and dropping your components from a palette to a build area. And then the code is generated for you. The big disadvantage is that this code may not be difficult to understand or not adapted to your practices, so to maintain it a lot of junk code is potentially generated.

In JavaFX 2 things change. Now you have FXML files that are used to create the UI. But what is a FXML file? It is a kind of XML that will contain all the controls of your UI.

In that example you can notice some things:

  • there are some imports like in a Java class
  • there is no Java code
  • it is pretty simple to understand

This is good news. Indeed, this means you are able to create a view without typing a single line of Java code and it is totally MVC-oriented.

With FXML you can also customize your controls by using CSS:

And if you would like to use stylesheets? It is also supported:

Properties and binding

How many times would you like to have been notified when a element was added in a list? Or when the value of a String changes? The Observer/Observable pattern is a solution, but it has to be triggered manually in each situation you would like to update it.

In JavaFX 2, things can be done automatically because a new type of object is available: Properties. A property encapsulates a Java type: String, int, boolean etc, and can have listeners.

For example, there is a StringProperty class for working on Strings, IntegerProperty, BooleanProperty and many more. But you also have the generic ObjectProperty, so that you can encapsulate your own Java object. Let’s take a look how to add a listener to a property:

Nothing more, nothing less. Each time the value of the property changes, the listener is triggered. What can also be done is bind properties together:

Each time the anotherRebelGeek value changes, rebelGeek will be updated with the new value. Look at this another binding example:

This will first display 400.67 then 4000.67. Magical isn’t it? So you easily imagine some use cases: resizing a window will resize its elements, typing in a text field will display the conversion from $ to €, etc.

Other cool stuff

There is more than what we’ve already mentioned that are interesting in JavaFX:

  • A chart API is available so that you can create, customize and interact with charts. They are dynamically updated when the data set changes.
  • A media engine allowing you to play songs and video. It is a long way from JMF; streaming is also supported.
  • A web engine providing a full browser based on WebKit will allow you to display web content directly in your app.
  • ImageOps allows you to directly work with image to manipulate their properties and pixels.
  • Creating custom components is easy and allows you to either extend existing controls or create brand new ones in order to fulfill your needs.
  • And in JavaFX 8 (coming with Java 8) you will also have the 3D support–but this is for later ;)

Rapid Application Development with JavaFX

I think a great evolution in Java app development is the possibility to easily customize the UI you’re creating. To be honest, Swing was horrible at natively customizing the components you were using. You had libraries to modify the look and feel but what about corporate UI (in which you have to integrate your company fonts, design and so on)?

In JavaFX, everything is customizable using JavaFX CSS: it is not CSS like you know it in web development, but it’s very similar. You don’t have to write any Java code (in most cases) to change the look and feel of your app and it can be done really quickly. This is really progressive, and if you want to go further you can create your own components from scratch or extending existing ones. For example, if you would like to create a search field with a text field and a search button just next to it you can create a custom component adding a text field and a button and use CSS to customize them.

Ultimately, JavaFX provides you with more tools to do RAD (Rapid Application Development):

  • SceneBuilder allows you to create your UI by drag and dropping components on a scene and then generate the FXML file. You have a CSS previewer built in to see what your CSS looks like.
  • ScenicView allows you to manipulate the components while your app is running. It is very useful to modify the CSS and see the result on the fly before applying it in your code.

Conclusion

JavaFX is the successor of Swing, which will be deprecated, and even though it is still young it will help you a lot. It changes the way we do UI in Java by bringing new concepts, plus it’s easy to learn and use and even fun to try out. As Java developer for many years, JavaFX is a huge step forward for developing desktop apps in Java. But don’t take my word for it–test it yourself!

I’m happy to see your comments below, or tweet your thoughts at @twasyl or @ZeroTurnaround.

Проблемы производительности JavaFX и Swing

У нас постоянно возникали проблемы с производительностью при запуске JavaFX внутри JFXPanel в приложениях на основе Swing.

Это кажется проблемой только при работе на JDK1.7, потому что когда бы ни было возможно запустить JDK1.8, это прекрасно работает без изменения какого-либо кода.

Симптомы состоят в том, что приложение, по-видимому, отображает шрифты нечетко, а также производительность ужасна (несколько секунд, чтобы ответить на нажатие клавиши при наборе текста в TextField).

Мы соблюдаем правильные правила для потоков EDT, AWT и Platform, поэтому я сомневаюсь, что это может быть проблемой.

Мы застряли в необходимости поддержки JDK1.7, потому что это плагин для NetBeans, который некоторые пользователи будут запускать на JDK1.7 по разным причинам, и мы не можем заставить их обновиться.

РЕДАКТИРОВАТЬ: Вот MCVE, который воссоздает проблему

Тесты, которые мы выполняем, имеют очень простой javafx, например, только с AnchorPane с TextField и абсолютно без кода, а просто набирать текст в TextField очень медленно.

Поведение выглядит очень похоже на конфликт блокировки между потоками Swing и JavaFX, но не похоже, что мы можем найти какое-либо объяснение или решение.


Записки программиста

Краткий обзор GUI-фреймворков для Java и мое первое простенькое GUI-приложение на Swing

Так исторически сложилось, что с UI мне приходилось работать очень мало. Видимо, поэтому мне так интересные всякие там Qt и wxW >

Ситуация с GUI фреймворками в мире Java несколько запутанная. Насколько я смог разобраться, дела обстоят следующим образом.

  • AWT (Abstract Window Toolkit) был первым GUI фреймворком. Идея была правильная — AWT использует нативные контролы, то есть, они выглядят и физически являются родными, независимо от того, где вы запускаете свое приложение. К сожалению, оказалось, что (1) общих для различных окружений контролов мало и (2) писать кроссплатформенные нативные интерфейсы так, чтобы ничего не поползло и не разъехалось, очень сложно;
  • Поэтому на смену AWT пришел Swing. Swing использует формочки, создаваемые AWT, на которых он своими силами рисует контролы. Работает это хозяйство, понятно дело, медленнее, но зато UI становится намного более портабельным. Swing предлагает на выбор программисту множество Look&Feel, благодаря которым можно сделать либо так, чтобы приложение выглядело и вело себя одинаково как под Windows, так и под Linux, либо чтобы приложение было очень похоже на нативное независимо от того, где его запускают. В первом случае приложение проще отлаживать, во втором — становятся счастливее пользователи. Кстати, изначально Swing был сделан парнями из Netscape;
  • SWT (Standard W >всех-всех-всех платформ, и тогда приложение вроде как даже станет портабельным, но только до тех пор, пока не появится какая-нибудь новая операционная система или архитектура процессора;
  • JavaFX активно пилится в Oracle и позиционируется, как скорая замена Swing. Идеологически JavaFX похож на Swing, то есть, контролы не нативные. Среди интересных особенностей JavaFX следует отметить хардверное ускорение, создание GUI при помощи CSS и XML (FXML), возможность использовать контролы JavaFX’а в Swing’е, а также кучу новых красивых контролов, в том числе для рисования диаграмм и 3D. Видео с более детальным обзором JavaFX можно посмотреть здесь. Начиная с Java 7, JavaFX является частью JRE/JDK;
  • NetBeans Platform (не путать с NetBeans IDE!) — это такая штука, которая, как я понял, работает поверх Swing и JavaFX, предоставляет как бы более удобный интерфейс для работы с ними, а также всякие дополнительные контролы. В одном приложении, использующем NetBeans Platform, я видел возможность перетаскивать вкладки drug&drop’ом, располагая панели в окне подобно тому, как это делают тайловые оконные менеджеры. По всей видимости, сам Swing так не умеет. Почитать про NetBeans Platform поподробнее можно здесь;

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

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

Наше приложение будет выглядеть следующим образом под Ubuntu:

А так оно будет выглядеть при запуске под Windows:

Как видите, JRE под Windows и Linux включают в себя разный набор L&F. Кроме того, вы можете подключить сторонний Look&Feel или даже написать свой. По умолчанию используется L&F Metal, который во всех ОС и оконных менеджерах выглядит более-менее одинаково. Если вам больше нравятся круглые кнопочки, то вместо Metal можно использовать Look&Feel Nimbus. Если вам хочется, чтобы приложение было похоже на нативное, то под Linux следует выбрать L&F GTK+ (интересно, а если пользователь сидит под KDE?), а под Windows — L&F Windows. Неплохой идеей, видимо, будет предусмотреть в вашей программе возможность переключаться между различными L&F. С другой стороны, при этом придется тестировать работу приложения со всеми этими L&F.

Цукерберг рекомендует:  Сервер - Помогите подключить git на сервере с сайтом!

Давайте посмотрим на исходный код приложения. Коллеги UI-щики заверили меня, что никаких WYSIWYG редакторов они не используют, а если используют, то разве что для быстрого прототипирования. Из неплохих WYSIWYG редакторов назывался JFormDesigner. Говорят, генерируемый им код даже похож на код, написанный человеком, а не адовую().последовательность().вызовов().методов(). В общем, весь код писался лапками в IntelliJ IDEA.

В Swing и AWT, если мы хотим что-то поменять в UI, мы должны делать это из event dispatching thread. Статический метод invokeLater принимает класс, реализующий интерфейс Runnable, и вызывает его метод run() внутри event dispatching thread. Если вам не знаком приведенный выше синтаксис, то это такой способ в Java объявить класс, не присваивая ему имени. Классы без имени называются анонимными. Часто анонимные классы в Java выполняют ту же роль, что играют лямда-фукнции в функциональных языках программирования. Помимо прочего, поддерживаются и замыкания. Интересно, что, в отличие от лямбд, анонимные классы в Java позволяют передать сразу пачку методов. Притом, при помощи наследования и абстрактных классов, для всех или части методов можно взять их реализацию по умолчанию.

Аннотация @Override проверяет, что метод run() действительно переопределит метод интерфейса Runnable. Без нее при переопределении метода мы можем случайно сделать опечатку и определить новый метод вместо того, чтобы переопределить существующий. Впрочем, в данном конкретном случае аннотация, видимо, не очень полезна, и, наверное, даже является лишней.

В итоге event dispatching thread вызовет метод createGUI(), полный код которого следующий:

private static void createGUI ( ) <
JList String > list = new JList <> ( ) ;
list. setSelectionMode ( ListSelectionModel . SINGLE_SELECTION ) ;

JScrollPane listScrollPane = new JScrollPane ( list ) ;

JPanel topPanel = new JPanel ( ) ;
topPanel. setLayout ( new BorderLayout ( ) ) ;
topPanel. add ( listScrollPane, BorderLayout . CENTER ) ;

ActionListener updateButtonListener = new UpdateListAction ( list ) ;
updateButtonListener. actionPerformed (
new ActionEvent ( list, ActionEvent . ACTION_PERFORMED , null )
) ;

JButton updateListButton = new JButton ( «Update list» ) ;
JButton updateLookAndFeelButton = new JButton ( «Update Look&Feel» ) ;

JPanel btnPannel = new JPanel ( ) ;
btnPannel. setLayout ( new BoxLayout ( btnPannel, BoxLayout . LINE_AXIS ) ) ;
btnPannel. add ( updateListButton ) ;
btnPannel. add ( Box . createHorizontalStrut ( 5 ) ) ;
btnPannel. add ( updateLookAndFeelButton ) ;

JPanel bottomPanel = new JPanel ( ) ;
bottomPanel. add ( btnPannel ) ;

JPanel panel = new JPanel ( ) ;
panel. setBorder ( BorderFactory . createEmptyBorder ( 5 , 5 , 5 , 5 ) ) ;
panel. setLayout ( new BorderLayout ( ) ) ;
panel. add ( topPanel, BorderLayout . CENTER ) ;
panel. add ( bottomPanel, BorderLayout . SOUTH ) ;

JFrame frame = new JFrame ( «Look&Feel Switcher» ) ;
frame. setMinimumSize ( new Dimension ( 300 , 200 ) ) ;
frame. setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE ) ;
frame. add ( panel ) ;
frame. pack ( ) ;
frame. setVisible ( true ) ;

updateListButton. addActionListener ( updateButtonListener ) ;
updateLookAndFeelButton. addActionListener (
new UpdateLookAndFeelAction ( frame, list )
) ;
>

Тут, в общем-то, нет ничего супер сложного. Создаются кнопки, список, список заворачивается в JScrollPane, чтобы у списка была прокрутка. Элементы управления располагаются во фрейме при помощи панелей. Панели могут иметь различные лайоуты, здесь мы использовали BorderLayout и BoxLayout. Принцип аналогичен тому, что используется в wxWidgets.

Для реакции на различные события, например, нажатия кнопок, используются классы, реализующие интерфейс ActionListener. В приведенном выше коде используется два таких класса — UpdateListAction и UpdateLookAndFeelAction. Как нетрудно догадаться по названию, первый класс отвечает за обработку нажатий на левую кнопку «Update list», второй — на правую кнопку «Update Look&Feel». ActionListener’ы привязываются к кнопкам при помощи метода addActionListener. Поскольку сразу после запуска приложения нам хочется увидеть список доступных Look&Feel, мы эмулируем нажатие на кнопку «Update list». Для этого мы создаем экземпляр класса ActionEvent и передаем его в качестве аргумента методу actionPerformed класса UpdateListAction.

Реализация класса UpdateListAction следующая:

static class UpdateListAction implements ActionListener <
private JList String > list ;

public UpdateListAction ( JList String > list ) <
this . list = list ;
>

@Override
public void actionPerformed ( ActionEvent event ) <
ArrayList String > lookAndFeelList = new ArrayList <> ( ) ;
UIManager. LookAndFeelInfo [ ] infoArray =
UIManager . getInstalledLookAndFeels ( ) ;
int lookAndFeelIndex = 0 ;
int currentLookAndFeelIndex = 0 ;
String currentLookAndFeel >=
UIManager . getLookAndFeel ( ) . getClass ( ) . getName ( ) ;

for ( UIManager. LookAndFeelInfo info : infoArray ) <
if ( info. getClassName ( ) . equals ( currentLookAndFeel >) ) <
currentLookAndFeelIndex = lookAndFeelIndex ;
>
lookAndFeelList. add ( info. getName ( ) ) ;
lookAndFeelIndex ++;
>

String [ ] listDataArray = new String [ lookAndFeelList. size ( ) ] ;
final String [ ] newListData =
lookAndFeelList. toArray ( listDataArray ) ;
final int newSelectedIndex = currentLookAndFeelIndex ;

SwingUtilities . invokeLater ( new Runnable ( ) <
@Override
public void run ( ) <
list. setListData ( newListData ) ;
list. setSelectedIndex ( newSelectedIndex ) ;
>
> ) ;
>
>

В конструкторе передается указатель на список, в котором мы будет отображать доступные Look&Feel. На самом деле, поскольку UpdateListAction является вложенным классом нашего основного класса LookAndFeelSwitcher, у него есть возможность обращаться напрямую к полям создавшего его экземпляра LookAndFeelSwitcher. Но функциональщик внутри меня сопротивляется такому подходу, поэтому я решил передать ссылку на список явно через конструктор.

Метод actionPerformed будет вызываться при нажатии на кнопку. Код этого метода довольно тривиален — мы просто используем статические методы класса UIManager для получения списка доступных Look&Feel, а также определения текущего Look&Feel. Затем обновляется содержимое списка и выбранный в нем элемент. Тут нужно обратить внимание на два момента. Во-первых, каждый Look&Feel имеет имя и имя класса, это разные вещи. Пользователю мы должны показывать имена, а при переключении Look&Feel использовать имя класса. Во-вторых, обратите внимание на то, как создаются final переменные newListData и newSelectedIndex, которые затем используются в анонимном классе. Это и есть тот самый аналог замыканий, речь о котором шла ранее. Очевидно, использование не final переменных в замыканиях привело бы к печальным последствиям.

Наконец, рассмотрим класс UpdateLookAndFeelAction:

static class UpdateLookAndFeelAction implements ActionListener <
private JList String > list ;
private JFrame rootFrame ;

public UpdateLookAndFeelAction ( JFrame frame, JList String > list ) <
this . rootFrame = frame ;
this . list = list ;
>

@Override
public void actionPerformed ( ActionEvent e ) <
String lookAndFeelName = list. getSelectedValue ( ) ;
UIManager. LookAndFeelInfo [ ] infoArray =
UIManager . getInstalledLookAndFeels ( ) ;

for ( UIManager. LookAndFeelInfo info : infoArray ) <
if ( info. getName ( ) . equals ( lookAndFeelName ) ) <
String message = «Look&feel was changed to » + lookAndFeelName ;
try <
UIManager . setLookAndFeel ( info. getClassName ( ) ) ;
SwingUtilities . updateComponentTreeUI ( rootFrame ) ;
> catch ( ClassNotFoundException e1 ) <
message = «Error: » + info. getClassName ( ) + » not found» ;
> catch ( InstantiationException e1 ) <
message = «Error: instantiation exception» ;
> catch ( IllegalAccessException e1 ) <
message = «Error: illegal access» ;
> catch ( UnsupportedLookAndFeelException e1 ) <
message = «Error: unsupported look and feel» ;
>
JOptionPane . showMessageDialog ( null , message ) ;
break ;
>
>
>
>

Здесь мы просто (1) находим L&F с именем, равным имени, выбранному в списке, (2) меняем L&F при помощи static метода setLookAndFeel класса UIManager и (3) перерисовываем главный фрейм нашего UI, а также, рекурсивно, расположенные на нем элементы, при помощи static метода updateComponentTreeUI класса SwingUtilities. Наконец, мы уведомляем пользователя при помощи сообщения, все ли прошло успешно.

Также хотелось бы сказать пару слов об отладке GUI-приложений на Java, и не только GUI. Во-первых, в Swing есть такое волшебное сочетание клавиш Ctr + Shift + F1, которое выводит в stdout информацию о том, как расположены контролы. Очень полезно, если хочется слизать UI у конкурентов. Во-вторых, есть такой интересный хоткей Ctr + \. Если нажать его в консоли работающего приложения на Java, будут выведены все нитки и их стектрейсы. Удобно, если вы словили дэдлок. Наконец, в-третьих, во время разработки GUI бывает полезно разукрасить панели в разные цвета. Сделать это можно так:

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

What is JavaFX and how is it different from Swing and AWT?

If you are a beginner in Java and are learning through online courses on Udemy or books you must have heard about Swing and AWT. There is no doubt these are amazing tools and many software developers and companies are using it to create applications, I am here to tell don’t learn these technologies.

Swing, AWT, JavaFX all are a part of JDK and are used to create Graphical User Interface(GUI) with JavaFX being one of the latest entrants in this list.

Abstract Window Toolkit, or more commonly known as AWT, is the oldest of these three. It is more like a ‘do-it-yourself’ kind of GUI creating technology which has no inbuilt packages/libraries for creating many important features of an interface like creating a table for which you would need a bunch of labels or field items along with scroll pane coded manually for each row and column of a table. Swing whereas does the exact thing for you. It is lightweight (though there are some components that can be termed as heavyweight) and runs over AWT itself. Like for the above example, one can use JTable which is a library in Swing that does the exact thing I had mentioned in a much better and sophisticated way.

There are hundreds of really wonderful open source applications and APIs created using Swing that are available on GitHub. It clearly enjoyed its dominance over all these years, until 2012. In 2012, Oracle decided to add JavaFX to its JDK and that is when it started to gain popularity.

A brief about JavaFX

JavaFX is, according to me, a modern and a state of the art API to create GUI applications. Not to get confused by the name, JavaFX is primarily written in C++ and next major language used in it is Java, its name only suggests that the API is for Java applications and not C++.

What one can do in JavaFX that is not possible in Swing?

JavaFX has a support for customization using CSS (yes, the same CSS that is used to beautify web pages) and XML. For a moment, just focus on CSS. CSS i.e., Cascading Style Sheets can be used to modify the look and feel of the application. A very naive example can be changing the color of the button when hovering over it and having some other color when the mouse doesn’t point the button. Oracle’s docs on CSS presence in JavaFX reads, “Cascading Style Sheets (CSS) separate appearance and style from implementation so that developers can concentrate on coding. Graphic designers can easily customize the appearance and style of the application through the CSS. If you have a web design background, or if you would like to separate the user interface (UI) and the back-end logic, then you can develop the presentation aspects of the UI in the FXML scripting language and use Java code for the application logic.”

With JavaFX one can also create beautiful 3-D applications that are next to impossible in Swing and making the same with AWT makes the idea of establishing a colony on Mars much simpler. Yes, I admit using another API, Java3D, one can create 3-D applications over AWT but working with it is really difficult as compared to JavaFX.

How to get started with JavaFX?

Oracle docs provide a great head start in JavaFX. As one progresses on the learning track of this formidable tool, he/she can start developing small projects and check with StackOverflow whenever stuck. Next step would be to view and learn from some well crafted APIs and applications created in JavaFX on GitHub. There is this repository on GitHub that has a curated list of all awesome applications, frameworks, books, tutorials, and much more for JavaFX at a single place. Go on and explore it as soon as you finish reading this article.

Which JDK to use for it?

JDK 8 would be by far the best choice. The reason is, JDK 8 is supported till 2022 and Oracle has lately announced that JavaFX would no longer be shipped along with JDKs starting from JDK 11. JavaFX is going open source under the name OpenJFX and JavaFX version 11 (stable) is just around the corner which would be launched separately as a JAR package.

A quick tip: Whenever asking a question related to JavaFX on StackOverflow, do mention the version as JavaFX changed really fast in the past.

Integrating JavaFX 2.0 with Swing and SWT

Posted by: Dustin Marx in Desktop Java January 4th, 2012 0 Views

Both JFXPanel and FXCanvas allow a JavaFX Scene to be set on their instance. The instance of Scene (based on my Simple JavaFX 2.0 Text Example post) to be be used in my examples in this post are provided by the method shown in the next JavaFX-specific code example.

Method Providing a JavaFX Scene for Integration

A JavaFX Scene can be integrated into Swing code via the JavaFX class JFXPanel and its setScene(Scene) method. This is demonstrated in the next code listing, which gets the particular Scene instance from the method in the previous code listing.

JavaFX/Swing Integration with JFXPanel

The output of running this simple Java Swing application with embedded JavaFX Scene is shown next.

Integrating SWT with JavaFX is arguably even easier and is demonstrated in the next code listing. As with the Swing integration example, the main approach is to call FXCanvas‘s setScene(Scene) method.

JavaFX/SWT Integration with FXCanvas

The next screen snapshot shows what this simple SWT application with embedded JavaFX looks like.

The code listings for Swing integration with JavaFX and for SWT integration with JavaFX shown above are only slightly adapted from the Javadoc documentation for the JavaFX classes JFXPanel (Swing) and FXCanvas (SWT). It is nice that these classes provide these examples in their documentation and it is really nice that integration has become so much easier. For more thorough coverage of JavaFX/Swing integration, see Integrating JavaFX into Swing Applications.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих