Deutsch
GitHub
Design

Desktop-UI für Java

Desktop-Anwendungen in Java, von Grund auf gezeichnet.

Limn zeichnet seine Pixel selbst. Widgets, Layout, Text, Diagramme, Medien und ein 3D-Viewport, in einer Abhängigkeit, ohne Swing, ohne JavaFX und ohne natives Toolkit darunter.

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

Offen gebaut mit Claude Code: Claude hat es geschrieben, Menschen haben es gesteuert und geprüft. Was der Bau gekostet hat, ist schon bezahlt, und Sie müssen es nicht noch einmal bezahlen. Wie Limn entsteht

Die Demo-Anwendung, von Limn während dieses Builds gerendert.
Die Demo-Anwendung, von Limn während dieses Builds gerendert.
Die Demo-Anwendung, von Limn während dieses Builds gerendert.

Jetzt ausprobieren

Die Demo und der Theme-Editor, direkt aus Maven Central. Nichts zu klonen; jbang lädt ein JDK, falls keines da ist. JBang ermittelt die neueste Version einmal und behält sie: Fügen Sie --fresh hinzu, um eine neuere zu holen.

# die Auslage
jbang demo@limn-toolkit/limn-toolkit
# der Theme-Editor
jbang theme-editor@limn-toolkit/limn-toolkit
# die Auslage
jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit
# der Theme-Editor
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit

Fünf Minuten

Eine Abhängigkeit und eine main-Methode

Keine Auszeichnungssprache, kein Annotation Processor, kein Build-Plugin. Das Backend hinzufügen, das das Toolkit mitbringt, einfaches Java schreiben, und Sie haben ein Fenster.

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

Was Sie bekommen

Ein Komponentensatz, den Sie nicht selbst bauen müssen

Schaltflächen, Felder, Listen, Tabellen, Bäume, Datumsauswahlen, Reiter, Menüs, Dialoge, Karten, geteilte Bereiche, ein Farbwähler, Balken-, Linien- und Ringdiagramme sowie eine virtualisierte Liste, in der eine Million Zeilen so viel kostet wie zwanzig. Jede davon liest Farbe, Form und Dichte aus dem Design, also ist nichts fest verdrahtet und ein kompakter Modus ist eine Zeile. Über ihre Fenster hinaus druckt eine Anwendung auf Papier oder als PDF, hält ein Symbol im System-Tray, setzt ihre Menüs in die Menüleiste von macOS und tauscht per Drag-and-drop Inhalte mit anderen Programmen aus.

Alle ansehen
Button
Button
ComboBox
ComboBox
Slider
Slider
SegmentedControl
SegmentedControl
Checkbox and switch
Checkbox and switch
Spinner
Spinner

Layout, das in den Kopf passt

Sechs Widgets und ein Marker: eine Spalte stapelt, eine Zeile verteilt, ein Wrap bricht in die nächste Zeile um, wenn die Breite ausgeht, ein Grid richtet Zellen in beide Richtungen aus, ein Stapel überlagert, Padding rückt ein, und Expanded sagt, wer den übrigen Platz bekommt. Opacity und Transform blenden einen Teil des Fensters ein und aus, verschieben, skalieren und drehen ihn, ohne das Layout um ihn herum zu stören. Es gibt keinen Constraint-Solver zu konfigurieren und keinen Layout-Manager zu installieren.

Layout-Anleitung lesen
Ein mit Limn gestaltetes Fenster
Ein mit Limn gestaltetes Fenster
Ein Fenster aus einer Spalte, einer Zeile, einem Split und einem Expanded.

Formulare ohne Framework

Ein Feld ist ein Widget, eine Validierungsregel ist ein Listener, und Absenden ist ein Methodenaufruf. Nichts zu binden, nichts zu registrieren, und Validierungszustände, die ein Feld in dem Moment umfärben, in dem der Nutzer es korrigiert.

Formular-Anleitung lesen
Ein mit Limn gebautes Formular
Ein mit Limn gebautes Formular
Beschriftungen, Validierung, eine Auswahl und die Aktionszeile.

Tabellen, Bäume und Datumsangaben, schon gebaut

Eine Tabelle sind typisierte Spalten über der Liste, die Ihre Anwendung besitzt, sortiert vom Toolkit oder von Ihrem Server, mit einer Fußzeile, die summiert. Ein Baum ist eine Gliederung über Kindern, die Sie liefern, und eine Zeile darf Kinder versprechen, bevor sie sie benennen kann. Ein Datumsfeld tippt ein ISO-Datum im Kalender des Lesers selbst, und ein Datumswähler öffnet dahinter ein Monatsraster.

Listen-Anleitung lesen
Eine Tabelle, ein Baum und zwei Datums-Widgets in einem Limn-Fenster
Eine Tabelle, ein Baum und zwei Datums-Widgets in einem Limn-Fenster
Eine Tabelle, ein Baum, ein Datumsfeld und ein Datumswähler in einem Fenster.

Video und 3D sind auch nur Widgets

Ein physikalisch basierter 3D-Viewport und ein Videoplayer, zusammengesetzt wie gewöhnliche Widgets: eine Scroll-Ansicht beschneidet sie, ein Stapel zeichnet darüber, und sie nehmen am Layout teil wie eine Beschriftung.

Medien-Anleitung lesen
Der 3D-Viewport von Limn
Der 3D-Viewport von Limn
Der 3D-Viewport, eingesetzt in ein gewöhnliches Fenster.

Für alle

Jede Sprache, und jeder Screenreader

In den Sprachen Ihrer Nutzer

Lateinisch, Griechisch, Kyrillisch und CJK mischen sich in einer Zeichenkette, und für jeden Abschnitt eines Schriftsystems wird eine Schriftart gewählt. Arabisch, Hebräisch, Devanagari und Thai werden korrekt geformt — verbundene Buchstaben, Ligaturen, diakritische Zeichen — und eine von rechts nach links laufende Sprache spiegelt das ganze Fenster: Zeilen, Ränder, Bildlaufleisten, Pfeiltasten. Eingabemethoden komponieren im Feld, und die Bearbeitung bewegt sich nach Graphemen.

Zum Text-Leitfaden
Derselbe Bildschirm, aufgenommen auf Japanisch, vereinfachtem Chinesisch, Koreanisch und Russisch, zu einem Fenster zusammengesetzt.
Derselbe Bildschirm, aufgenommen auf Japanisch, vereinfachtem Chinesisch, Koreanisch und Russisch, zu einem Fenster zusammengesetzt.
Dieselbe Oberfläche, während dieses Builds in vier Sprachen aufgenommen.

Vorgelesen, in denselben Sprachen

Ein Screenreader unter Windows, VoiceOver unter macOS und Orca unter Linux lesen ein Limn-Fenster über die Barrierefreiheits-API der jeweiligen Plattform, ohne Plattformcode in Ihrer Anwendung. Jedes Steuerelement beschreibt sich mit Rolle, Name und Zustand, in der Sprache, in der die Oberfläche angezeigt wird. Ein Steuerelement zu benennen ist ein Aufruf.

Zum Leitfaden zur Barrierefreiheit
  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
Das Formular oben, so wie es einem Screenreader mitgeteilt wird, aufgenommen während dieses Builds.

Ihre Identität, nicht die des Toolkits

Ihre Anwendung soll nach Ihrem Produkt aussehen, nicht nach der Bibliothek, mit der sie gebaut wurde. Ein Theme sind reine Daten (jede Farbe, der Eckenradius, die Größenstufe, die jedes Steuerelement erbt), und ein Aufruf tauscht es zur Laufzeit. Laden Sie die Schrift Ihrer Marke aus einer Datei, die Ihnen gehört: vom Aussehen des Toolkits bleibt nichts übrig.

So funktioniert das Theming
Derselbe dichte Bildschirm mit Steuerelementen, siebenmal nebeneinander gerendert, jeder Streifen in einer anderen Palette, Größenstufe und Schrift.

Dieselben Komponenten, sieben Themes

Zeigen Sie auf eine Spalte, um ihr Theme auf dem ganzen Bildschirm zu sehen.Tippen Sie auf eine Spalte, um ihr Theme zu sehen; wischen Sie zur Seite, um zu wechseln.

Ein Bildschirm, sieben Themes. Der Code hinter jedem Streifen ist identisch.

Offen gelegt

Wie Limn entsteht

Der Code von Limn wird von Claude, dem Modell von Anthropic, in Claude Code geschrieben und von Menschen gesteuert und geprüft. Wir sagen das gleich vorweg, weil Sie es wissen wollen würden.

Gesteuert heißt: Jede Entwurfsentscheidung ist ein schriftlicher Beschluss in docs/adr, begründet und angenommen, bevor der Code entsteht. Geprüft heißt: Jede Änderung läuft gegen eine Testsuite, die umfangreicher ist als der Code selbst; die Barrierefreiheit wurde angehört statt angenommen, mit einem Screenreader unter Windows, VoiceOver unter macOS und Orca unter Linux, die echte Fenster vorlesen; und der Code ist durch wiederholte Audits zu Korrektheit, Leistung und API-Design gegangen.

Bis hierher waren viele tausend Modellaufrufe und Millionen erzeugter Tokens nötig. Nach dem Schätzmodell COCOMO II entsprechen die über hunderttausend Codezeilen, Tests nicht mitgezählt, der Arbeit eines Teams von etwa zwanzig Personen über mehr als zwei Jahre. Diese Arbeit ist getan. Sie können darauf aufbauen, statt sie zu wiederholen.

Die Entwurfsentscheidungen lesen

In fünf Minuten ein Fenster auf dem Bildschirm

Die Installationsanleitung endet mit einem laufenden Programm. Alles danach ist das Handbuch, die Komponentengalerie und die API-Referenz.