Português
GitHub
Tema

UI desktop para Java

Aplicações desktop em Java, desenhadas do zero.

O Limn desenha os próprios pixels. Widgets, layout, texto, gráficos, mídia e um viewport 3D, em uma dependência, sem Swing, sem JavaFX e sem toolkit nativo por baixo.

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

A aplicação de demonstração, renderizada pelo Limn durante este build.
A aplicação de demonstração, renderizada pelo Limn durante este build.
A aplicação de demonstração, renderizada pelo Limn durante este build.

Teste agora

A vitrine e o editor de temas, direto do Maven Central: nada para clonar, e nada para instalar além do jbang, que baixa uma JDK se você não tiver nenhuma. O que baixa é o toolkit, as fontes e as bibliotecas nativas desta máquina, não as das outras cinco plataformas.

-XstartOnFirstThread é exclusiva do macOS, e uma JVM que a receba em qualquer outro sistema se recusa a iniciar. Os aliases rodam a versão mais recente; para fixar uma, nomeie a coordenada: jbang io.github.limn-toolkit:limn-demo:0.7.0. Sem rede, a demo também é um único arquivo anexado a cada release.

jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit  # a vitrine
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit  # o editor de temas
jbang demo@limn-toolkit/limn-toolkit  # a vitrine
jbang theme-editor@limn-toolkit/limn-toolkit  # o editor de temas
jbang demo@limn-toolkit/limn-toolkit  # a vitrine
jbang theme-editor@limn-toolkit/limn-toolkit  # o editor de temas

Cinco minutos

Uma dependência e um método main

Sem linguagem de marcação, sem processador de anotações, sem plugin de build. Adicione o backend, que traz o toolkit junto, escreva Java puro e você tem uma janela.

Ler o guia de instalação
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();
    }
}

O que você ganha

Um conjunto de componentes que você não precisa construir

Botões, campos, listas, abas, menus, diálogos, painéis divididos, um seletor de cor, gráficos de barra, linha e rosca, e uma lista virtualizada em que um milhão de linhas custa o mesmo que vinte. Cada um deles lê a cor, a forma e a densidade do tema, então nada fica fixo no código e um modo compacto é uma linha.

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

Um layout que cabe na cabeça

Quatro widgets e um marcador: uma coluna empilha, uma linha distribui, uma pilha sobrepõe, o padding recua e o Expanded diz quem fica com o espaço que sobrou. Esse é todo o vocabulário; não há solver de restrições para configurar nem layout manager para instalar.

Ler o guia de layout
A window laid out with Limn
A window laid out with Limn
Uma janela feita de uma coluna, uma linha, um split e um Expanded.

Formulários sem framework

Um campo é um widget, uma regra de validação é um listener e submeter é uma chamada de método. Nada para vincular, nada para registrar, e estados de validação que recolorem o campo no instante em que o usuário corrige.

Ler o guia de formulários
A form built with Limn
A form built with Limn
Rótulos, validação, uma escolha e a linha de ações.

Vídeo e 3D também são widgets

Um viewport 3D com materiais fisicamente corretos e um player de vídeo, compostos como widgets comuns: uma scroll view os recorta, uma pilha desenha por cima e ambos participam do layout como um rótulo participa.

Ler o guia de mídia
The Limn 3D viewport
The Limn 3D viewport
O viewport 3D, composto em uma janela comum.

Nos idiomas dos seus usuários

O texto é medido com os mesmos avanços com que é desenhado, e o fallback de fonte roda caractere a caractere, então latino, grego, cirílico e CJK se misturam em uma mesma string sem você escolher tipografia. Os métodos de entrada compõem dentro do campo, e a edição anda por cluster de grafema, então marcas combinantes e emoji de várias partes nunca são partidos ao meio. E a direita para a esquerda não é só shaping: a direção é um eixo que a subárvore herda, então uma janela em hebraico se espelha — e ainda pode conter um painel de código da esquerda para a direita.

Leia o guia de texto
A mesma tela capturada em japonês, chinês simplificado, coreano e russo, costurada em uma única janela.
A mesma tela capturada em japonês, chinês simplificado, coreano e russo, costurada em uma única janela.
A mesma tela, capturada em quatro idiomas durante este build.

Sua identidade, não a do toolkit

Sua aplicação deve parecer com o seu produto, não com a biblioteca em que foi feita. Um tema é dado puro (cada cor, o raio dos cantos, o passo de tamanho que todo controle herda), e uma chamada troca tudo em tempo de execução. Carregue a tipografia da sua marca de um arquivo seu, e nada da aparência do toolkit sobrevive.

Como funciona a temização
A mesma tela densa de controles renderizada sete vezes lado a lado, cada faixa em uma paleta, um passo de tamanho e uma tipografia diferentes.
Uma tela, sete temas. O código por trás de cada faixa é idêntico.

Antes de se comprometer

O que o Limn não faz

Todo toolkit troca alguma coisa. Estas são as trocas, ditas de saída, porque descobri-las na terceira semana é pior do que lê-las agora.

  • Somente texto horizontal

    O árabe, o hebraico, o devanágari e o tailandês têm shaping onde quer que haja texto, o leiaute é espelhado por um eixo herdado da direita para a esquerda, e dígitos, ordenação e maiúsculas seguem o idioma — os pacotes ar e he são publicados, com um Bold para cada escrita. O que não existe é escrita vertical: nada de colunas de cima para baixo, nenhum segundo eixo atravessando o leiaute. Linhas quebram; não são justificadas.

  • Sem ponte para leitores de tela

    A navegação por teclado e os anéis de foco estão completos, mas nada é exposto às APIs de acessibilidade da plataforma. Se um leitor de tela precisa funcionar, este ainda não é o toolkit para essa aplicação.

  • Pré-1.0

    A API ainda se move entre releases, e OpenGL é o único caminho de renderização. Fixe a sua versão e leia as notas de release.

Uma janela na tela em cinco minutos

O guia de instalação termina com um programa rodando. Tudo depois disso é o guia, a galeria de componentes e a referência da API.