本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
RandomLayout
不会自动排布任何东西:每个子组件都需要 bounds。当你调用 add(...) 而未设定布局时,它是默认布局。尽管名字如此,它却是浮层和浮动卡片的基础。
🔴 · 包:
dev.crossfly.ui.layout· 继承自:Layout
何时使用
- 浮层、浮动卡片、自由定位。
- 你自行控制 bounds 的自定义布局。
何时不要使用
- 常规屏幕 → 使用会自动排布的布局(Vertical/Horizontal/Grid)。
add(...)
public Layout add(Object... params); // 只收集组件;不对其定位
两种定位方式
- 手动(像素——非响应式):
filho.setBounds(x, y, w, h)。 - 相对(响应式——推荐):
filho.setRelativeBounds(Relative x, Relative y, Relative w, Relative h)。RandomLayout的doLayout()会为每个具有相对 bounds 的子组件自动调用Relative.setBounds(c)。
完整示例(复制、粘贴并运行)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.graphics.*;
/** 可执行的主界面。将 launcher 指向此类(classname)并运行:gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
// Window 本身默认使用 RandomLayout(无 setLayout)
Component card = new Component();
card.setLayout(new VerticalLayout(Position.START, Position.START));
card.add(LAY_AUTO, new Label("Cartão flutuante"));
card.setRelativeBounds(
Relative.CENTER, // x:居中
Relative.CENTER, // y:居中
Relative.ofScreen(0.8f, ScreenSize.MIN), // 宽度:较短边的 80%
Relative.ofFont(10f) // 高度:10 行字体
);
add(card); // RandomLayout 解析相对边界
}
}
下面的片段只展示核心部分(放进
onShow()里的内容)。要运行它们,请将其放入上面的MainWindow骨架中。
基本用法(响应式居中卡片)
Component overlay = new Component(); // 无 setLayout → RandomLayout
Component card = new Component();
card.setRelativeBounds(
Relative.CENTER, // x:居中
Relative.CENTER, // y:居中
Relative.ofScreen(0.8f, ScreenSize.MIN), // 宽度:较短边的 80%
Relative.ofFont(10f) // 高度:10 行字体
);
overlay.add(card); // RandomLayout 解析相对边界
最佳实践
- 优先使用
setRelativeBounds而非setBounds——保持响应式。 - 如果必须使用固定的
setBounds,请在Window.onReposition()(resize 时调用)中重新计算。
常见错误
- 使用固定的
setBounds(x,y,w,h),导致在其他屏幕/密度下 UI 出问题。 - 忘记若没有 bounds(既无固定也无相对),子组件会停在
(0,0)且尺寸为 0。
另请参阅
这个页面有帮助吗?感谢你的反馈!