Русский
GitHub
Тема

Настольный интерфейс для Java

Настольные приложения на Java, нарисованные с нуля.

Limn рисует свои пиксели сам. Виджеты, компоновка, текст, диаграммы, медиа и 3D-вьюпорт умещаются в одной зависимости, без Swing, без JavaFX и без нативного тулкита под низом.

JDK 17 · Windows, macOS, Linux · Apache-2.0

Демонстрационное приложение, отрисованное Limn во время этой сборки.
Демонстрационное приложение, отрисованное Limn во время этой сборки.
Демонстрационное приложение, отрисованное Limn во время этой сборки.

Попробуйте прямо сейчас

Витрина и редактор тем — прямо с Maven Central: клонировать нечего, устанавливать нечего, кроме jbang, который заодно скачает JDK, если её у вас нет. Скачиваются тулкит, шрифты и нативные библиотеки этой машины, а не остальных пяти платформ.

-XstartOnFirstThread существует только на macOS, и JVM, получившая его где-то ещё, откажется запускаться. Алиасы запускают последний релиз; чтобы закрепить версию, назовите координату: jbang io.github.limn-toolkit:limn-demo:0.7.0. Без сети демо есть и одним файлом, приложенным к каждому релизу.

jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit  # витрина
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit  # редактор тем
jbang demo@limn-toolkit/limn-toolkit  # витрина
jbang theme-editor@limn-toolkit/limn-toolkit  # редактор тем
jbang demo@limn-toolkit/limn-toolkit  # витрина
jbang theme-editor@limn-toolkit/limn-toolkit  # редактор тем

Пять минут

Одна зависимость и метод main

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

Читать руководство по установке
build.gradle.kts
dependencies {
    implementation("io.github.limn-toolkit:limn-backend-lwjgl:0.7.0")
}
Main.java
public static void main(String[] args) {
    // macOS needs -XstartOnFirstThread on the JVM command line; it is macOS-only and a
    // JVM elsewhere given it will not start.
    try (Backend backend = new LwjglBackend()) {
        NativeWindow window = backend.createWindow(
                new WindowConfig("Hello, Limn", 480, 320, true, true));

        Column column = new Column();
        column.gap(12);
        column.add(new Label("A window, drawn by Limn."));
        column.add(new Button("Close").onAction(window::requestClose));

        Scene scene = new Scene(new Padding(Insets.all(24), column));
        scene.bind(window);

        backend.runEventLoop();
    }
}

Что вы получаете

Набор компонентов, который не нужно писать самому

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

Посмотреть все
Button
Button
ComboBox
ComboBox
Slider
Slider
SegmentedControl
SegmentedControl
Checkbox and switch
Checkbox and switch
Spinner
Spinner

Компоновка, которая помещается в голове

Четыре виджета и один маркер: колонка складывает, ряд распределяет, стопка накладывает, отступ отодвигает, а Expanded говорит, кому достанется оставшееся место. Это весь словарь. Нет ни решателя ограничений, который надо настраивать, ни менеджера компоновки, который надо ставить.

Читать руководство по компоновке
A window laid out with Limn
A window laid out with Limn
Окно из колонки, ряда, разделителя и одного Expanded.

Формы без фреймворка

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

Читать руководство по формам
A form built with Limn
A form built with Limn
Подписи, проверка, выбор и ряд действий.

Видео и 3D тоже виджеты

3D-вьюпорт с физически корректными материалами и видеоплеер, скомпонованные как обычные виджеты: прокручиваемая область их обрезает, стопка рисует поверх, и оба участвуют в компоновке так же, как подпись.

Читать руководство по медиа
The Limn 3D viewport
The Limn 3D viewport
3D-вьюпорт, встроенный в обычное окно.

На языках ваших пользователей

Текст измеряется теми же метриками, которыми он рисуется, а подстановка шрифтов работает посимвольно, поэтому латиница, греческий, кириллица и CJK смешиваются в одной строке, а вам не приходится выбирать начертание. Методы ввода составляют текст прямо в поле, а редактирование движется по кластерам графем, поэтому комбинирующие знаки и составные эмодзи никогда не разрываются. И справа налево — это не только шейпинг: направление — ось, которую наследует поддерево, поэтому окно на иврите зеркалится — и при этом может держать панель кода слева направо.

Руководство по тексту
Один и тот же экран, снятый на японском, упрощённом китайском, корейском и русском и сшитый в одно окно.
Один и тот же экран, снятый на японском, упрощённом китайском, корейском и русском и сшитый в одно окно.
Один и тот же экран, снятый на четырёх языках во время этой сборки.

Ваш облик, а не облик тулкита

Приложение должно выглядеть как ваш продукт, а не как библиотека, на которой оно собрано. Тема сводится к простым данным: каждый цвет, радиус скругления, шаг размера, который наследует любой элемент управления. Один вызов меняет её во время работы. Гарнитуру своего бренда вы загружаете из собственного файла, и от внешности тулкита не остаётся ничего.

Как устроены темы
Один и тот же плотный экран элементов управления, отрисованный семь раз рядом; у каждой полосы своя палитра, свой шаг размера и своя гарнитура.
Один экран, семь тем. Код за каждой полосой одинаковый.

Прежде чем решиться

Чего Limn не делает

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

  • Только горизонтальный текст

    Арабский, иврит, деванагари и тайский шейпятся всюду, где рисуется текст, компоновка зеркалится вдоль наследуемой оси справа налево, а цифры, сортировка и регистр следуют за языком — переводы ar и he публикуются, и у каждой письменности есть жирное начертание. Чего нет — так это вертикального письма: ни колонок сверху вниз, ни второй оси сквозь компоновку. Строки переносятся; выключки по ширине нет.

  • Нет моста к программам чтения с экрана

    Навигация с клавиатуры и кольца фокуса сделаны полностью, но ничего не передаётся в API доступности платформы. Если программа чтения с экрана обязана работать, для такого приложения этот тулкит пока не подходит.

  • До 1.0

    API ещё меняется между релизами, а единственным путём отрисовки остаётся OpenGL. Фиксируйте версию и читайте примечания к выпускам.

Окно на экране за пять минут

Руководство по установке заканчивается работающей программой. Дальше идут руководство, галерея компонентов и справочник API.