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

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

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

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

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

Сделан открыто, с помощью Claude Code: код написал Claude, а направляли и проверяли его люди. То, чего стоила разработка, уже оплачено, так что платить за неё снова вам не нужно. Как делается Limn

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

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

Демо и редактор тем — прямо из Maven Central. Ничего клонировать не нужно; если JDK нет, jbang скачает её. JBang один раз определяет новейший релиз и сохраняет его: чтобы получить более новый, добавьте --fresh.

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

Пять минут

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

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

Читать руководство по установке
build.gradle.kts
dependencies {
    implementation("io.github.limn-toolkit:limn-backend-lwjgl:1.0.0")
}
pom.xml
<dependency>
  <groupId>io.github.limn-toolkit</groupId>
  <artifactId>limn-backend-lwjgl</artifactId>
  <version>1.0.0</version>
</dependency>
Main.java
import limn.backend.Backend;
import limn.backend.NativeWindow;
import limn.backend.WindowConfig;
import limn.backend.lwjgl.LwjglBackend;
import limn.components.Button;
import limn.components.Label;
import limn.scene.Insets;
import limn.scene.Scene;
import limn.scene.layout.Column;
import limn.scene.layout.Padding;

/** A window with a label and a button that closes it. */
public final class HelloWindow {

    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(
                    WindowConfig.of("Hello, Limn", 480, 320));

            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();
        }
    }
}

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

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

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

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

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

Шесть виджетов и один маркер: колонка складывает, ряд распределяет, ряд с переносом уходит на новую строку, когда кончается ширина, сетка выравнивает ячейки по обеим осям, стопка накладывает, отступ отодвигает, а Expanded говорит, кому достанется оставшееся место. Opacity и Transform меняют прозрачность части окна, сдвигают, масштабируют и поворачивают её, не трогая компоновку вокруг. Нет ни решателя ограничений, который надо настраивать, ни менеджера компоновки, который надо ставить.

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

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

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

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

Таблицы, деревья и даты уже готовы

Таблица — это типизированные колонки над списком, которым владеет ваше приложение, отсортированным тулкитом или вашим сервером, с подвалом, который суммирует. Дерево — это структура над потомками, которых вы предоставляете, и строка может пообещать потомков раньше, чем сумеет их назвать. Поле даты вводит дату ISO в календаре самого читателя, а выбор даты открывает за ним сетку месяца.

Читать руководство по спискам
Таблица, дерево и два виджета даты в окне Limn
Таблица, дерево и два виджета даты в окне Limn
Таблица, дерево, поле даты и выбор даты в одном окне.

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

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

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

Для всех

Каждый язык — и каждая программа чтения с экрана

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

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

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

Читается вслух, на тех же языках

Программа экранного доступа в Windows, VoiceOver в macOS и Orca в Linux читают окно Limn через собственный API доступности каждой платформы, без платформенного кода в вашем приложении. Каждый элемент описывает себя ролью, именем и состоянием — на языке, на котором показан интерфейс. Дать элементу имя — один вызов.

Читать руководство по доступности
  1. heading“Create your account”
  2. label“Full name”
  3. text field“Full name”label · focusable, editable, required
  4. label“12 / 40”
  5. label“Email”
  6. text field“Email”label · focusable, editable, invalid, required
  7. label“Enter an address like ada@example.com”
  8. label“Password”
  9. password field“Password”label · focusable, editable, password
  10. label“At least 12 characters”
  11. label“Plan”
  12. combo box“Plan”label · focusable, expandable, has-popup
  13. switch“Email me release notes”focusable, checked
  14. separatorhorizontal
Форма выше — так, как о ней сообщают программе чтения с экрана; снято во время этой сборки.

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

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

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

Те же компоненты, семь тем

Наведите указатель на столбец, чтобы увидеть его тему на всём экране.Коснитесь столбца, чтобы увидеть его тему; проведите в сторону, чтобы сменить.

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

Открыто

Как делается Limn

Код Limn пишет Claude, модель Anthropic, в Claude Code, а направляют и проверяют работу люди. Мы говорим об этом сразу, потому что вы захотели бы это знать.

Направлять значит, что каждое проектное решение записано в docs/adr, обосновано и принято до того, как написан код. Проверять значит, что каждое изменение проходит набор тестов, который больше самого кода; что доступность не предполагалась, а была прослушана: программа экранного доступа в Windows, VoiceOver в macOS и Orca в Linux читали настоящие окна; и что код прошёл повторные аудиты корректности, производительности и дизайна API.

Путь сюда занял тысячи обращений к модели и миллионы сгенерированных токенов. По модели оценки COCOMO II более ста тысяч строк кода, не считая тестов, это работа команды примерно из двадцати человек на срок более двух лет. Эта работа сделана. Вы можете строить на ней, а не повторять её.

Читать проектные решения

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

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