Графика для JVM

Допустим, я хочу создавать качественные десктопные приложения. Я также хочу сделать это на JVM. Не надейтесь — мы еще не достигли цели. Но у меня есть план.
Почему именно JVM?
Это производительность на достаточно высоком уровне, но не заставляет вас слишком много задумываться о каждом выделение памяти. Это кроссплатформенно. В нем есть отличные языки — Kotlin, Scala и, конечно же, Clojure. C # тоже подойдет, но в нем нет Clojure.
Разве вы уже не можете создавать десктопные приложения на JVM?
Вы можете. Но традиционно AWT, Swing и JavaFX сопровождались множеством недостатков в качестве и производительности. Они были настолько существенными, что только одной компании удалось создать прилично выглядящее приложение на Swing. Это возможно, но требует огромных усилий.
Разве не все пользовательские интерфейсы Java прокляты?
Нет, не совсем. У AWT, Swing и JavaFX есть свои проблемы, но это исключительно их проблемы. Нет фундаментальной причины, по которой невозможно создать высококачественный пользовательский интерфейс на JVM. Просто это еще не было сделано.
Почему это еще не было сделано?
Я думаю, это связано с терпением. Мы так привыкли к вещам, которые можно собрать за неделю, что никто не думает о годах. А для хорошего пользовательского интерфейса требуются годы работы. Это большое обязательство.
Почему не Electron?
Первая причина — производительность. JS — отличный язык для создания пользовательского интерфейса, но он намного медленнее, чем JVM. Wasm может быть быстрым, но подразумевает C ++ или Rust.
Второй — это модель DOM. Это ужасающая коллекция уловок, которые делают простые вещи сложными, а сложные — невозможными. Я много раз думал: «Если бы я рисовал этот элемент управления/макет напрямую, я бы закончил несколько часов назад».
Это означает, что существует очень низкий предел возможностей веб-приложений с точки зрения производительности и качества. Я считаю, что мы можем и должны добиться большего.
Однако Electron научил нас двум хорошим вещам:
- Люди жаждут нативных приложений. Никто не хочет работать из браузера.
- Людей не волнует, что приложения не выглядят нативными для платформы, если они хорошо выглядят.
Десктоп по-прежнему актуален?
Я верю, что это так!
Недавно я смотрел интервью между разработчиком Android и разработчиком iOS. Один спрашивал:
«Кто-нибудь по-прежнему пишет десктопные приложения?»
На что другой ответил:
«Понятия не имею… Может быть?»
Оба они записывали его на десктопе, в десктопном приложении, во время разговора через другое десктопное приложение. Вероятно, для пост-обработки использовалось несколько других десктопных приложений. Ни один из них не был написан волшебными эльфами и не оставлен нам могущественной древней цивилизацией. Десктоп может быть менее модным, но только потому, что здесь труднее продавать бесполезную хрень.
И я был на обеих сторонах. Однажды я жил без десктопа несколько недель. К этому привыкаешь, но это, конечно, не идеал. Сбор и обработка любой информации очень болезненны: сложно выделить текст, сложно выполнить поиск на странице, сложно иметь несколько вкладок, сложно перемещать данные между приложениями. Например, вы добавляете событие в календарь. Вам нужно найти адрес события в почте, где есть ссылка, открывающая браузер. К тому времени, когда вы нашли то, что вам нужно, и вернули в календарь, оно уже выгружается из памяти, и весь контекст теряется. Возможность одновременного открытия нескольких окон — это суперспособность десктопа.
Телефоны отлично подходят для небольших быстрых одноцелевых задач. У них есть свое место, но жизнь намного сложнее, чем телефон. Многим из нас все еще нужен этот велосипед для ума.
Хорошо, что же ты предлагаешь?
Путь к качественному пользовательскому интерфейсу на JVM — долгий. Нам понадобятся:
- графическая библиотека,
- библиотека интеграции окна / ОС,
- набор инструментов пользовательского интерфейса.
Сегодня я рад анонсировать первую часть этого эпического квеста: графическую библиотеку. Она называется Skija и представляет собой просто набор привязок к очень мощной, хорошо известной библиотеке Skia. Та, которую поддерживает Chrome, Android, Flutter и Xamarin.

Как и любая другая библиотека JVM, она кроссплатформенная. Она работает в Windows, Linux и macOS. Это так же просто, как добавить файл JAR. Намного проще, чем массировать флаги компилятора C ++ в течение нескольких дней, прежде чем вы сможете что-либо скомпилировать. Skija позаботится об управлении памятью за вас. И привязки создаются вручную, поэтому они всегда имеют смысл и доставляют удовольствие (по крайней мере, насколько позволяет Skia API).
Что с этим делать? В основном рисовать. Линии. Треугольники. Прямоугольники. Но также: кривые, контуры, формы, буквы, тени, градиенты.

Думайте об этом как о Canvas API. Но вроде бы действительно продвинутой версии. Она понимает цветовые пространства, современную типографику, макет текста, ускорение графического процессора и тому подобное.

О, и это быстро. Действительно быстро. Если этого достаточно для Chrome, вероятно, этого будет достаточно и для вашего приложения.
Что я могу с этим сделать?
Много вещей! Пользовательские библиотеки виджетов пользовательского интерфейса и целые наборы инструментов, графики, диаграммы, визуализации, игры. Например, мы поигрались с реализацией java.awt.Graphics2D и запуском Swing поверх него — похоже, все работает нормально.
Зачем выпускать отдельную графическую библиотеку? Чем это полезно?
Я не большой поклонник объединять все в одном месте. Вы никогда не сможете угадать все детали правильно — кто-то всегда будет недоволен конкретным решением.
Независимые взаимозаменяемые библиотеки более гибкие. Философия Unix.
Что с остальной кусочками паззла?
Обе вещи находятся в разработке в JetBrains.
- Для интеграции управления окнами и ОС есть Skiko. Она говорит, что это Skia для Kotlin, но она также реализует создание окон, события, пэкэджинг и все остальное. Она даже интегрируется с AWT и Swing.
- А для инструментария пользовательского интерфейса есть Compose Desktop. Это форк Android Compose, декларативного UI-фреймворка, работающего в десктопной среде.
Но прелесть в том, что это даже не обязательно эти двое!
Не нравится AWT? Принесите свою собственную библиотеку окон.
Kotlin не подходит Вам? Используйте любой другой язык JVM.
Compose плохо справляется с нагрузкой? Молитесь, чтобы кто-нибудь написал альтернативу или написал что-то свое (извините, но хорошего решения пока нет. Это еще только начало).
И, конечно, если вы хотите развернуть свою собственную библиотеку окон или набор инструментов для виджетов — пожалуйста, сделайте это! Мы надеемся, что это произойдет.
В заключение
Skija — это часть более широкой картины. Прогресс пользовательского интерфейса Java был заблокирован некачественной Graphics2D. Но все меняется. Что из этого выйдет? Время покажет.
Пожалуйста, попробуйте Skija и поделитесь с нами своим мнением. Или, может быть, начните ей пользоваться — мы были бы счастливы, если бы вы это сделали! Вот ссылка:
Облачные серверы от Маклауд быстрые и безопасные.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!
Как начать работать с графикой в Java
Eclipse — кроссплатформенная среда разработки, поддерживает множество языков программирования, среди которых есть и Java. Данный урок будет посвящён написанию простых графических приложений на языке Java в Eclipse.
Для начала вам нужно загрузить и установить Eclipse. Распакуйте архив в удобное для вас место. После распаковки программа готова к работе, если на вашем компьютере установлена Java.

Запустите Eclipse и создайте новый проект: File>New>Project>Java Project.

Выберите версию Java, для которой будут создаваться проекты, если у вас установлено несколько версий. Введите имя проекта и нажмите Finish.

Создайте новый класс Этот класс будет запускаться при запуске приложения, прорисовывать окно и элементы на нём.
import java.awt.*; import javax.swing.*; public class Window{ public static void main(String[] args) { /* Задание заголовка окна*/ JFrame w=new JFrame("Окно с изображением"); /*Задание размеров окна*/ w.setSize(400, 400); /* Если у окна не будет функции закрытия, * при нажатии крестика окно не закроется.*/ w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* Менеджер определяет * каким образом в окне расположены объекты.*/ w.setLayout(new BorderLayout(1,1));
Таким образом будет описано окно, но для того, чтобы оно появилось на экране, нужно задать настройки видимости. Теперь добавьте то, что будете рисовать в окне. Для этого создайте новый класс в этом же файле, расширяющий класс JComponent. В JComponent описываются основные методы для объектов java.swing. Для Graphics2D описаны методы, позволяющие рисовать линии, заливать области. Так для рисования прямоугольника используется метод drawRect().
/* Класс, который будет рисовать элементы*/ class Canvas extends JComponent{ /*Метод, перерисовывающий элемент внутри окна *при обновлении*/ public void paintComponent(Graphics g){ super.paintComponents(g); Graphics2D g2d=(Graphics2D)g; /* Устанавливает цвет рисования в зелёный*/ g2d.setPaint(Color.GREEN); /* Рисует текущим цветом прямоугольник */ g2d.drawRect(100, 100, 80, 20); g2d.setPaint(Color.RED); /* Рисует текущим цветом в координатах (150,150) строку "привет мир"*/ g2d.drawString("Привет мир", 150, 150); g2d.setColor(Color.blue); /* Рисует текущим цветом овал в координатах (200,50)*/ g2d.fillOval(200, 50, 50, 20); /* Вызывает обновление себя после завершения рисования */ super.repaint(); } }
Теперь есть компонент, который будет прорисовываться при обращении к нему. Осталось прикрепить его к окну. Для этого в методе main добавьте элемент Canvas к окну и сделайте окно видимым.
Canvas canv=new Canvas(); w.add(canv); w.setVisible(true); } }

После сохранения файла можно запустить программу, выбрав в меню Run>Run либо нажав комбинацию ctrl+F11.
Результат:
На что способна библиотека Swing на Java.
Я хочу создать несколько игр на чистом Eclipse IDE Java. Я смирился с тем, что придется делать только оконные приложение, но я заинтересовался графической библиотеке Swing. Там были только одни компоненты и один ImageIcon. Короче, что вы считаете по этому поводу: «Библеотека Swing (java) для создании игр»??
- Alexsan9999
- Постоялец
#1
19:48, 20 дек 2014
На одном swing’e далеко не уедешь. Что-то вроде тетриса можно собрать. Вообще, для создания игр на java есть фреймворки: libgdx, jme3, plantformn.
#2
20:36, 20 дек 2014
Обзор Eclipse Java: среда разработки “под себя”


В мире ИТ есть два лагеря: проприетарное ПО и open-source. И если среди коммерческих сред разработки практически безраздельно лидирует IDEA (с амбициями на open-source), открытые IDE представлены единственным фаворитом — Eclipse. Ее часто выбирают программисты, которым нравится настраивать среду разработки под себя. Что это за IDE такая и в чем ее плюсы, минусы? Давайте разбираться.
Об IDE
Eclipse Java IDE — открытая интегрированная среда разработки на языке программирования Java, которая распространяется и поддерживается Eclipse Foundation. Изначально Eclipse создавалась компанией IDE как преемник среды разработки IBM VisualAge. Несмотря на то, что разработка стоила компании 40 миллионов долларов, исходный код стал открытым, и IBM передала инструмент на дальнейшее развитие независимому сообществу.
Чтобы стать частью сообщества Java-разработчиков, необходимы знания и опыт. В этом поможет проект JavaRush: обучение сделано в форме онлайн-игры, 900 мини-лекций, 1200(!) практических задач, разбор вопросов на собеседованиях и помощь в составлении резюме.
Условия использования

Eclipse IDE бесплатна, что дает ей большое преимущество. Любой разработчик может установить себе свежую версию этого инструмента. Донаты, конечно, принимаются. У Eclipse также есть платная версия — MyEclipse, но это скорее отдельный проект, построенный на базе Eclipse. MyEclipse предлагает полнофункциональную платформу для разработки ПО, а также дополнительные пакеты. К примеру, MyEclipse Blue поддерживает интеграцию с семейством продуктов WebSphere, а Professional-версия реализует расширенный функционал для Enterprise-разработки. Eclipse, в отличие от платной версии, — это ядро, к которому подключаются дополнительные плагины для создания IDE мечты.
Основные характеристики и инструменты

При использовании оборотов “. самый популярный инструмент…” и “. бесплатно…” многие думают, что функционал IDE урезан и поддерживает стандартный набор функций. Это не так. Eclipse Java IDE — полноценный инструмент, принятый в качестве корпоративного стандарта во многих больших компаниях. При установке вам предложат выбрать нужную среду разработки: В меню много вариантов, так как в инструментарий Eclipse входит не только Java. Однако в нашем случае интересны первые два: for Java Developers и for Enterprise Java Developers. Как следует из описания, Enterprise вариант подходит для разработки Java и Web-приложений, инструменты для Enterprise разработки, JPA, JSF и так далее. Текущая версия Eclipse на момент написания обзора — 2019-09 R (4.13.0). Базовый функционал IDE не зависит от вида (EE или стандартная), но для серьезных проектов потребуется Enterprise-версия, которая облегчит жизнь при разработке таких приложений.
Написание кода
Редактор Eclipse выглядит просто и понятно — стандартное окно для работы с кодом, где отображается структура проекта и другие параметры.
При первой установке по умолчанию активируется темная тема. Светлая тема не так радует глаз, хотя это субъективно 🙂
Также приятная особенность: классы стандартной библиотеки импортируются автоматически, функция включена по умолчанию.
В арсенале Eclipse есть полезная функция QuickFix, которая помогает быстро поправить строку кода. Если запустить QuickFix на 14 строке кода:
Пробуем извлечь значение в локальную переменную:
С помощью этой функции можно выполнять любые действия: от простого извлечения локальной переменной до более сложных операций.
Рефакторинг
Рефакторинг кода на Java в Eclipse отличается от этого процесса в IDEA. Дело в том, что в Eclipse не хватает понимания контекста, как это делает IDEA. Это заметно при рефакторинге. Самый простой пример — изменение имени переменной. IDEA учитывает название, тип, значение, имена предыдущих переменных похожего типа и предлагает подходящее имя. Eclipse так не умеет. Если пользователь привык к “интеллектуальному” рефакторингу в IDEA, то потребуется время, чтобы привыкнуть. В остальном процедура рефакторинга поддерживает все стандартные функции. Например, извлечение интерфейса, safe delete и прочие (всего — 23).
Дебаггер

Процесс дебага приложения в Eclipse несложный, стандартные функции интуитивны, в дебаг-меню отображается состояние переменных и текущего контекста:
Разработка GUI
В Eclipse есть визуальный редактор для элементов графического интерфейса — Visual Editor, а также компилятор GUI. Visual Editor поддерживает AWT/Swing и доступен в Eclipse начиная с версии 2.1. Этот редактор нужно подключать отдельно.
Web-приложения

Для разработки веб-приложения у Eclipse есть 30 различных серверов приложений, а также дополнительные коннекторы:
Инструменты

Среди инструментов Eclipse также стоит выделить работу с системами контроля версий, авто-билд, системами сборки, интеграцию с самыми популярными фреймворками, удобную работу с дополнительными типами файлов (sql, html, js и тд).
Плюсы и минусы использования
Преимущества Eclipse
Плагины
Eclipse можно гибко настроить под себя благодаря простой разработке плагинов. Как уже сказано, Eclipse — это ядро: при первой установке эта IDE еще не может называться полноценной средой. Для этого нужно установить дополнительные плагины, и тогда разработка на Eclipse станет гораздо проще и приятнее. Каждый может сделать свою IDE.
Цена
Ее нет: Eclipse Java IDE распространяется бесплатно.
Кроссплатформенность
У любого приложения, написанного на Java, по умолчанию есть это преимущество. Eclipse можно запустить на любой платформе, на которой установлена Java.
Workspace
В Eclipse можно открыть несколько проектов в одном workspace, что сильно упрощает работу с модульными проектами или частичным переносом кода из одного проекта в другой.
Документация
Eclipse — зрелый продукт, популярный во всем мире, поэтому у него есть большая база документации, в которой с вероятностью 90% найдется ответ на любой вопрос.
Оформление интерфейса
Принципиальной разницы между темными или светлыми темами интерфейсов Intellij IDEA и Eclipse нет, но многие программисты говорят, что у Eclipse — “профессиональный интерфейс, который помогает им чувствовать себя настоящими разработчиками”. Это субъективный плюс.
Недостатки Eclipse
Плагины
Да, как это ни странно, плагины — это и плюс, и минус. Дело в том, что при наличии большого количества несовместимых плагинов IDE может упасть, и будет нужна переустановка. Такой кейс часто встречается в больших проектах, а эта особенность не указана в официальной документации.
Неинтуитивный интерфейс
Новички рискуют заблудиться в дебрях интерфейса Eclipse. Eclipse чаще используют опытные программисты, которые хотят настроить инструмент под свои нужды. Это возможно благодаря богатой экосистеме плагинов и возможностям для их разработки.
Что еще почитать
- Делая обзор IDE, нельзя не упомянуть его сравнение с другими инструментами: здесь подробное сравнение Eclipse, Intellij IDEA и NetBeans.
- Также рекомендую статью о 10 возможностях Eclipse, чтобы стать продуктивнее.