简体中文
GitHub
主题

Java 的桌面 UI

用 Java 写桌面应用,像素由自己绘制。

Limn 自己绘制每一个像素。组件、布局、文本、图表、媒体与 3D 视口,只需一个依赖,没有 Swing,没有 JavaFX,底下也没有原生工具包。

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

本次构建期间由 Limn 渲染的演示应用。
本次构建期间由 Limn 渲染的演示应用。
本次构建期间由 Limn 渲染的演示应用。

立刻试试

陈列和主题编辑器,直接来自 Maven Central:没有什么要克隆,也没有什么要装,除了 jbang;你要是没有 JDK,它连 JDK 一起取来。下载的是工具包、字体,以及这台机器的原生库,另外五个平台的不会下载。

-XstartOnFirstThread 只有 macOS 认,别的系统上的 JVM 收到它会拒绝启动。别名运行的是最新发布版;想固定某个版本,就写坐标:jbang io.github.limn-toolkit:limn-demo:0.7.0。没有网络时,演示程序也是附在每次发布里的一个文件

jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit  # 陈列
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit  # 主题编辑器
jbang demo@limn-toolkit/limn-toolkit  # 陈列
jbang theme-editor@limn-toolkit/limn-toolkit  # 主题编辑器
jbang demo@limn-toolkit/limn-toolkit  # 陈列
jbang theme-editor@limn-toolkit/limn-toolkit  # 主题编辑器

五分钟

一个依赖和一个 main 方法

没有标记语言,没有注解处理器,没有构建插件。加上后端,它会把工具包一起带来,写普通的 Java,你就有了一个窗口。

阅读安装指南
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();
    }
}

你会得到什么

一套不必自己造的组件

按钮、输入框、列表、标签页、菜单、对话框、分栏、取色器,柱状图、折线图与环形图,还有一个虚拟化列表,其中一百万行的开销与二十行相同。每一个都从主题读取颜色、形状与密度,所以没有写死的值,紧凑模式只要一行。

查看全部
Button
Button
ComboBox
ComboBox
Slider
Slider
SegmentedControl
SegmentedControl
Checkbox and switch
Checkbox and switch
Spinner
Spinner

装得进脑子的布局

四个组件加一个标记:列纵向堆叠,行横向铺开,栈层层叠加,内边距向内收,Expanded 决定谁占据剩下的空间。整套词汇就这些。没有约束求解器要配置,也没有布局管理器要安装。

阅读布局指南
A window laid out with Limn
A window laid out with Limn
一个由列、行、分栏和一个 Expanded 组成的窗口。

不需要框架的表单

字段就是组件,校验规则就是监听器,提交就是一次方法调用。没有要绑定的,也没有要注册的;用户一改正,校验状态就把字段的颜色变回去。

阅读表单指南
A form built with Limn
A form built with Limn
标签、校验、一个选择项和操作行。

视频与 3D 同样是组件

基于物理的 3D 视口和视频播放器,像普通组件一样参与合成:滚动视图会裁剪它们,栈会画在它们上面,它们参与布局的方式与一个标签无异。

阅读媒体指南
The Limn 3D viewport
The Limn 3D viewport
合成进普通窗口中的 3D 视口。

用你的用户的语言

文本用与绘制相同的步进量来度量,字体回退逐字符进行,所以拉丁文、希腊文、西里尔文和中日韩文可以混在同一个字符串里,而你无需选择字体。输入法在字段内完成组字,编辑按字素簇移动,因此组合符号和多段式表情永远不会被切开。从右向左也不只是塑形:方向是子树继承的一条轴,所以希伯来语窗口会镜像——其中仍可以放一块从左向右的代码面板。

阅读文本指南
同一个界面分别用日语、简体中文、韩语和俄语截取,拼接成一个窗口。
同一个界面分别用日语、简体中文、韩语和俄语截取,拼接成一个窗口。
同一个界面,在本次构建中以四种语言截取。

是你的产品气质,不是工具包的

你的应用该像你的产品,而不像它所依赖的那个库。主题就是纯数据(每一种颜色、圆角半径、每个控件继承的尺寸档位),运行时一次调用即可整套替换。品牌字体从你自己掌握的文件加载,工具包自带的观感一点都不会留下。

主题是怎么工作的
同一个控件密集的界面并排渲染七次,每一条都用不同的配色、尺寸档位和字体。
同一个界面,七套主题。每一条背后的代码完全相同。

在你投入之前

Limn 做不到的事

任何工具包都有取舍。这些就是取舍,先说清楚,因为到第三周才发现,比现在读到要糟糕得多。

  • 仅横排文字

    阿拉伯文、希伯来文、天城文与泰文在任何绘制文字的地方都会正确塑形,版面沿一条可继承的从右向左轴镜像,数字、排序与大小写都跟随语言——ar 与 he 的翻译照常发布,每种文字都配有粗体。这里没有的是竖排:没有自上而下的栏,也没有贯穿布局的第二条轴。行会折断,但不做两端对齐。

  • 没有屏幕阅读器桥接

    键盘导航与焦点环是完整的,但没有向平台的无障碍 API 暴露任何内容。如果屏幕阅读器必须可用,这个工具包目前还不适合那样的应用。

  • 1.0 之前

    API 在版本之间仍会变动,而 OpenGL 是唯一的渲染路径。请锁定版本并阅读发行说明。

五分钟,让窗口出现在屏幕上

安装指南以一个能跑起来的程序收尾。此后的一切,就是指南、组件画廊和 API 参考。