Español
GitHub
Tema

Interfaz de escritorio para Java

Aplicaciones de escritorio en Java, dibujadas desde cero.

Limn dibuja sus propios píxeles. Widgets, disposición, texto, gráficos, medios y una vista 3D, en una dependencia, sin Swing, sin JavaFX y sin ningún kit nativo por debajo.

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

Hecho a la vista con Claude Code: Claude lo escribió; personas lo dirigieron y lo verificaron. Lo que costó construirlo ya está pagado, así que no tienes que volver a pagarlo. Cómo se hace Limn

La aplicación de demostración, renderizada por Limn durante esta compilación.
La aplicación de demostración, renderizada por Limn durante esta compilación.
La aplicación de demostración, renderizada por Limn durante esta compilación.

Pruébalo ahora

La demo y el editor de temas, directo desde Maven Central. Nada que clonar; jbang descarga un JDK si no tienes ninguno. JBang resuelve la versión más reciente una sola vez y la conserva: añade --fresh para obtener una más nueva.

# el escaparate
jbang demo@limn-toolkit/limn-toolkit
# el editor de temas
jbang theme-editor@limn-toolkit/limn-toolkit
# el escaparate
jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit
# el editor de temas
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit

Cinco minutos

Una dependencia y un método main

Sin lenguaje de marcado, sin procesador de anotaciones, sin complemento de compilación. Añade el backend, que trae el kit consigo, escribe Java normal y ya tienes una ventana.

Leer la guía de instalación
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();
        }
    }
}

Lo que obtienes

Un conjunto de componentes que no tienes que construir

Botones, campos, listas, tablas, árboles, selectores de fecha, pestañas, menús, diálogos, tarjetas, paneles divididos, un selector de color, gráficos de barras, de líneas y de anillo, y una lista virtualizada donde un millón de filas cuesta lo mismo que veinte. Cada uno lee su color, su forma y su densidad del tema, así que nada queda fijado en el código y un modo compacto es una línea. Más allá de sus ventanas, una aplicación imprime en papel o en PDF, deja un icono en la bandeja del sistema, pone sus menús en la barra de menús de macOS e intercambia contenido con otros programas arrastrando y soltando.

Verlos todos
Button
Button
ComboBox
ComboBox
Slider
Slider
SegmentedControl
SegmentedControl
Checkbox and switch
Checkbox and switch
Spinner
Spinner

Una disposición que cabe en la cabeza

Seis widgets y un marcador: una columna apila, una fila reparte, un wrap pasa a la línea siguiente cuando se acaba el ancho, una cuadrícula alinea las celdas en ambos sentidos, una pila superpone, el relleno separa y Expanded dice quién se queda con el espacio sobrante. Opacity y Transform desvanecen, desplazan, escalan y giran una parte de la ventana sin alterar la disposición que la rodea. No hay solucionador de restricciones que configurar ni gestor de disposición que instalar.

Leer la guía de disposición
Una ventana maquetada con Limn
Una ventana maquetada con Limn
Una ventana hecha de una columna, una fila, un divisor y un Expanded.

Formularios sin framework

Un campo es un widget, una regla de validación es un oyente y enviar es una llamada a un método. Nada que enlazar, nada que registrar, y estados de validación que recolorean el campo en el momento en que el usuario lo corrige.

Leer la guía de formularios
Un formulario hecho con Limn
Un formulario hecho con Limn
Etiquetas, validación, una elección y la fila de acciones.

Tablas, árboles y fechas, ya construidos

Una tabla son columnas tipadas sobre la lista que posee tu aplicación, ordenada por el toolkit o por tu servidor, con un pie que suma. Un árbol es un esquema sobre los hijos que tú proporcionas, y una fila puede prometer hijos antes de poder nombrarlos. Un campo de fecha escribe una fecha ISO en el calendario del propio lector, y un selector de fecha abre una cuadrícula del mes detrás de él.

Leer la guía de listas
Una tabla, un árbol y dos widgets de fecha en una ventana de Limn
Una tabla, un árbol y dos widgets de fecha en una ventana de Limn
Una tabla, un árbol, un campo de fecha y un selector de fecha en una ventana.

El vídeo y el 3D también son widgets

Una vista 3D con materiales físicamente realistas y un reproductor de vídeo, compuestos como widgets corrientes: una vista con desplazamiento los recorta, una pila dibuja encima y ambos participan en la disposición igual que una etiqueta.

Leer la guía de medios
La vista 3D de Limn
La vista 3D de Limn
La vista 3D, compuesta en una ventana corriente.

Para todos

Todos los idiomas, y todos los lectores de pantalla

En los idiomas de tus usuarios

Latino, griego, cirílico y CJK se mezclan en una misma cadena, y se elige una fuente para cada tramo de una misma escritura. Árabe, hebreo, devanagari y tailandés se dibujan con la forma correcta — letras unidas, ligaduras, diacríticos — y un idioma de derecha a izquierda refleja toda la ventana: filas, márgenes, barras de desplazamiento, flechas. Los métodos de entrada componen dentro del campo, y la edición avanza por grafema.

Lee la guía de texto
La misma pantalla capturada en japonés, chino simplificado, coreano y ruso, unida en una sola ventana.
La misma pantalla capturada en japonés, chino simplificado, coreano y ruso, unida en una sola ventana.
La misma pantalla, capturada en cuatro idiomas durante esta compilación.

Leído en voz alta, en esos mismos idiomas

Un lector de pantalla en Windows, VoiceOver en macOS y Orca en Linux leen una ventana Limn a través de la API de accesibilidad de cada plataforma, sin código de plataforma en tu aplicación. Cada control se describe con su rol, su nombre y su estado, en el idioma en que se muestra la interfaz. Nombrar un control es una llamada.

Lee la guía de accesibilidad
  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
El formulario de arriba, tal como se lo cuentan a un lector de pantalla, capturado durante esta compilación.

Tu identidad, no la del toolkit

Tu aplicación debe parecerse a tu producto, no a la biblioteca con la que se construyó. Un tema son datos puros (cada color, el radio de las esquinas, el paso de tamaño que hereda cada control), y una llamada lo cambia en tiempo de ejecución. Carga la tipografía de tu marca desde un archivo tuyo y no sobrevive nada del aspecto del toolkit.

Cómo funcionan los temas
La misma pantalla densa de controles renderizada siete veces en paralelo, cada franja con una paleta, un paso de tamaño y una tipografía distintos.

Los mismos componentes, siete temas

Pasa el puntero sobre una columna para ver ese tema en toda la pantalla.Toca una columna para ver ese tema; desliza hacia un lado para cambiar.

Una pantalla, siete temas. El código detrás de cada franja es idéntico.

A la vista

Cómo se hace Limn

El código de Limn lo escribe Claude, el modelo de Anthropic, en Claude Code, y lo dirigen y verifican personas. Lo decimos de entrada porque querrías saberlo.

Dirigido significa que cada decisión de diseño es un registro escrito en docs/adr, argumentado y aceptado antes del código. Verificado significa que cada cambio pasa por una batería de pruebas más extensa que el propio código; que la accesibilidad se escuchó en lugar de suponerse, con un lector de pantalla en Windows, VoiceOver en macOS y Orca en Linux leyendo ventanas reales; y que el código ha pasado por auditorías repetidas de corrección, rendimiento y diseño de API.

Llegar hasta aquí llevó miles de llamadas al modelo y millones de tokens generados. Según el modelo de estimación COCOMO II, sus más de cien mil líneas de código, sin contar las pruebas, equivalen al trabajo de un equipo de unas veinte personas durante más de dos años. Ese trabajo está hecho. Puedes construir sobre él en lugar de rehacerlo.

Lee los registros de diseño

Una ventana en pantalla en cinco minutos

La guía de instalación termina con un programa en marcha. Todo lo demás es la guía, la galería de componentes y la referencia de la API.