Français
GitHub
Thème

Interface de bureau pour Java

Des applications de bureau en Java, dessinées de zéro.

Limn dessine ses propres pixels. Widgets, mise en page, texte, graphiques, médias et une vue 3D, en une dépendance, sans Swing, sans JavaFX et sans boîte à outils native en dessous.

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

L’application de démonstration, rendue par Limn pendant cette compilation.
L’application de démonstration, rendue par Limn pendant cette compilation.
L’application de démonstration, rendue par Limn pendant cette compilation.

Essayez tout de suite

La vitrine et l’éditeur de thèmes, directement depuis Maven Central : rien à cloner, et rien à installer sinon jbang, qui télécharge aussi un JDK si vous n’en avez pas. Ce qui se télécharge, c’est le toolkit, les polices et les bibliothèques natives de cette machine, pas celles des cinq autres plateformes.

-XstartOnFirstThread n’existe que sur macOS, et une JVM qui le reçoit ailleurs refuse de démarrer. Les alias lancent la version la plus récente ; pour en figer une, nommez la coordonnée : jbang io.github.limn-toolkit:limn-demo:0.7.0. Sans réseau, la démo existe aussi en un seul fichier joint à chaque version.

jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit  # la vitrine
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit  # l’éditeur de thèmes
jbang demo@limn-toolkit/limn-toolkit  # la vitrine
jbang theme-editor@limn-toolkit/limn-toolkit  # l’éditeur de thèmes
jbang demo@limn-toolkit/limn-toolkit  # la vitrine
jbang theme-editor@limn-toolkit/limn-toolkit  # l’éditeur de thèmes

Cinq minutes

Une dépendance et une méthode main

Pas de langage de balisage, pas de processeur d’annotations, pas de greffon de build. Ajoutez le backend, qui apporte la boîte à outils avec lui, écrivez du Java ordinaire, et vous avez une fenêtre.

Lire le guide d’installation
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();
    }
}

Ce que vous obtenez

Un ensemble de composants que vous n’avez pas à écrire

Boutons, champs, listes, onglets, menus, boîtes de dialogue, panneaux divisés, un sélecteur de couleur, des graphiques en barres, en courbes et en anneau, et une liste virtualisée où un million de lignes coûte autant que vingt. Chacun lit sa couleur, sa forme et sa densité dans le thème : rien n’est figé dans le code, et un mode compact tient en une ligne.

Les voir tous
Button
Button
ComboBox
ComboBox
Slider
Slider
SegmentedControl
SegmentedControl
Checkbox and switch
Checkbox and switch
Spinner
Spinner

Une mise en page qui tient dans la tête

Quatre widgets et un marqueur : une colonne empile, une rangée répartit, une pile superpose, la marge intérieure retrait, et Expanded désigne qui prend l’espace restant. C’est tout le vocabulaire ; aucun solveur de contraintes à configurer, aucun gestionnaire de mise en page à installer.

Lire le guide de mise en page
A window laid out with Limn
A window laid out with Limn
Une fenêtre faite d’une colonne, d’une rangée, d’un séparateur et d’un Expanded.

Des formulaires sans framework

Un champ est un widget, une règle de validation est un écouteur, et soumettre est un appel de méthode. Rien à lier, rien à enregistrer, et des états de validation qui recolorent un champ à l’instant où l’utilisateur le corrige.

Lire le guide des formulaires
A form built with Limn
A form built with Limn
Libellés, validation, un choix et la rangée d’actions.

La vidéo et la 3D sont aussi des widgets

Une vue 3D à matériaux physiquement réalistes et un lecteur vidéo, composés comme des widgets ordinaires : une vue défilante les rogne, une pile dessine par-dessus, et ils participent à la mise en page comme un libellé.

Lire le guide des médias
The Limn 3D viewport
The Limn 3D viewport
La vue 3D, intégrée à une fenêtre ordinaire.

Dans les langues de vos utilisateurs

Le texte est mesuré avec les mêmes avances que celles de son tracé, et le repli de police se fait caractère par caractère. Latin, grec, cyrillique et CJC se mélangent donc dans une même chaîne sans que vous choisissiez de fonte. Les méthodes de saisie composent dans le champ, et l’édition avance par groupe de graphèmes : les signes combinants et les émojis en plusieurs parties ne sont jamais coupés. Et droite-à-gauche ne se limite pas au façonnage : la direction est un axe qu’un sous-arbre hérite, si bien qu’une fenêtre en hébreu se met en miroir — tout en pouvant contenir un panneau de code de gauche à droite.

Lire le guide du texte
Le même écran capturé en japonais, chinois simplifié, coréen et russe, assemblé en une seule fenêtre.
Le même écran capturé en japonais, chinois simplifié, coréen et russe, assemblé en une seule fenêtre.
Le même écran, capturé en quatre langues pendant cette compilation.

Votre identité, pas celle du toolkit

Votre application doit ressembler à votre produit, pas à la bibliothèque qui l'a produite. Un thème est une donnée brute (chaque couleur, le rayon des angles, le pas de taille dont hérite chaque contrôle), et un appel le remplace à l'exécution. Chargez la police de votre marque depuis un fichier qui vous appartient : il ne reste rien de l'apparence du toolkit.

Comment fonctionne la thématisation
Le même écran dense de contrôles rendu sept fois côte à côte, chaque bande dans une palette, un pas de taille et une police différents.
Un écran, sept thèmes. Le code derrière chaque bande est identique.

Avant de vous engager

Ce que Limn ne fait pas

Toute boîte à outils échange quelque chose. Voici ces échanges, annoncés d’emblée, parce que les découvrir la troisième semaine est pire que les lire maintenant.

  • Texte horizontal seulement

    L’arabe, l’hébreu, le devanagari et le thaï sont façonnés partout où du texte est dessiné, la mise en page se met en miroir le long d’un axe hérité de droite à gauche, et les chiffres, le tri et la casse suivent la langue — les paquets ar et he sont publiés, avec un gras pour chaque écriture. Ce qui manque, c’est l’écriture verticale : pas de colonnes de haut en bas, pas de second axe traversant la mise en page. Les lignes se coupent ; elles ne sont pas justifiées.

  • Pas de pont vers les lecteurs d’écran

    La navigation au clavier et les anneaux de focus sont complets, mais rien n’est exposé aux API d’accessibilité de la plateforme. Si un lecteur d’écran doit fonctionner, ce n’est pas encore la bonne boîte à outils pour cette application.

  • Avant la 1.0

    L’API bouge encore d’une version à l’autre, et OpenGL est le seul chemin de rendu. Figez votre version et lisez les notes de publication.

Une fenêtre à l’écran en cinq minutes

Le guide d’installation se termine par un programme qui tourne. Tout le reste, c’est le guide, la galerie de composants et la référence de l’API.