LiquidGlass UI 2.4.5 / SDK

横向微调器与嵌套间距

Spinner

new Spinner(value) 默认绘制左减号、中心数字、右加号。整组透明,不创建内部按钮子面板,也不另外画数字输入框底板。把它放进已有 Panel 或 Dialog 即可由父控件提供玻璃背景。

framed(true) 可选地让整个微调器绘制一层公共玻璃。这不影响布局,不会给左右操作分别添加底板。默认不启用。

range(min,max)、step(amount)、decimals(n)、number(value) 可以直接链式调用,返回 Spinner。已有 NumberField 继承关系、value()/onChange() 等继续兼容。

Spinner count = new Spinner(14).range(0, 23).step(1).decimals(0);
count.bounds(16, 48, 180, 40);
count.onChange(w -> System.out.println(count.number()));

指针在减号/加号的完整纵向操作区按下即可更新一次,不要求正好压在线段上。按住指针不会自动重复增减;键盘的连续 Up/Down 事件会正常重复步进。到范围端点时对应操作变淡,不发送重复的无效值变更。只读与禁用均阻止步进。

数字状态立即生效;160ms 动画只对旧数字、新数字的位移和 alpha 做插值,不把整数模型改成中间浮点数。符号自身有弹性缩放,松手后回到正常尺寸。快速 down/up 有最短可见脉冲。

点击中心恢复编辑;Typing / select / clipboard / undo / commit 使用文本编辑器行为,不让滚数字动画阻碍输入。方向键步进有数字切换动画。主题 reducedMotion 开启时直接显示最终数值,无旧数字叠影。

Spacing

Spacing.INSET          // 16,普通容器四周内容留白
Spacing.GAP            // 12,独立同级控件的间距
Spacing.COMPACT_INSET  // 4,小高度工具条/分段控件的对称内嵌留白
Spacing.CONTROL_HEIGHT // 38,标准输入/按钮行高
Spacing.LABEL_HEIGHT   // 20,复合编辑器标签行高

Panel 的默认 ROW / COLUMN / GRID 采用上述 INSET 和 GAP。设置 padding(...)、gap(...) 后仍以调用者指定值为准。ABSOLUTE 不会偷偷移动任何宿主 bounds();需要自动等距排列的界面应使用已有自动布局模式或相同的度量值。

GroupBox 和 Dialog 的自动布局会避开标题区;绝对坐标不自动加标题高度,避免破坏现有宿主代码。时间、颜色、文件浏览、消息框和属性表自身维护可用区域布局,缩小尺寸后仍计算右侧边距而不是使用固定的多个 x 常数。

时间编辑器固定三列等宽,标签居中,各列增减区域左右对称。列间、标签与数值行之间、数值与确认行之间都为 12 逻辑单位;面板左右与底部为 16。底层像素会根据宿主 UI scale 放大,不改变逻辑间距。

这些默认值不强行改变专用日历单元格、文本行距、图标笔画留白等不同语义的距离,也不要求所有类型组件具有完全相同高度。

示例与测试

examples/StepperSpacing.java 是可编译的完整窗口示例。构建后:

run-example.cmd 8 StepperSpacing

Linux 的 classpath 分隔符用 :。

tests/run-stepper.sh 跑确定性布局/绘制指令测试;tests/run-stepper-window.sh 在 Xvfb + Mesa 上使用真实鼠标键盘并录制截图。正常控件绘制没有读取 framebuffer,录制时才使用桌面截图。录屏时间间隔记录在 build/stepper-frames/timestamps-ns.txt。