本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
如何打开和关闭一个屏幕
目的。 在 CrossFly 中没有“路由”:每个屏幕都是一个 Window,导航是一个栈。打开一个屏幕是 show()(push);返回是 hide()(pop)。屏幕的 UI 应在 onShow() 中构建。
使用的 API
Window.show()— 将窗口压入EventsProcessor栈并调用onShow()(push)。如果在 paint 线程之外调用,则会调度并等待。Window.hide()— 将窗口弹出栈并调用onRemove()(pop)。如果存在反向过渡,则触发它。Window.onShow()— 由框架在入栈时调用的生命周期钩子;在这里构建 UI。始终先调用super.onShow()(它会重新计算 bounds 并调用onAdd(true))。EventsProcessor.topWindow()— 返回栈顶的窗口(即接收事件的窗口)。
完整示例(复制、粘贴并运行)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 可执行的主界面。将 launcher 指向此类(classname)并运行:gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
add(new Label("Tela inicial"));
add(new Button("Abrir detalhe").onAction(e -> new OutraTela().show())); // push
}
}
/** 入栈的屏幕;"Voltar" 按钮执行 pop(hide)并返回 MainWindow。 */
class OutraTela extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow(); // 必填:重新计算 bounds 并触发 onAdd()
setLayout(new VerticalLayout());
add(new Label("Detalhe do pedido"));
add(new Button("Voltar").onAction(e -> hide())); // pop:返回上一个屏幕
}
}
下面的片段只展示核心部分。要运行它,请将其放入上面的
MainWindow骨架中。
最小片段
// 已在源码核实:Window.show()/hide()/onShow();super.onShow() 会执行 updateBounds()+onAdd(true)
public class MinhaTela extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow(); // 必填:重新计算 bounds 并触发 onAdd()
setLayout(new GridLayout());
add(new Label("Detalhe do pedido"));
add(new Button("Voltar").onAction(e -> hide())); // pop:返回上一个屏幕
}
}
// 任何地方(例如:在上一个屏幕某按钮的 onAction 中):
new MinhaTela().show(); // push:入栈并显示
避免 bug 的规则:
- 绝不要在构造函数中构建依赖屏幕尺寸的 UI——
Screen.width/height只有在onShow()运行时才稳定。使用onShow()。 hide()关闭其自身的窗口。要从外部关闭栈顶窗口,请使用EventsProcessor.topWindow().hide()。show()在 paint 线程之外是安全的:它会转发到绘制线程并等待。
深入了解
这个页面有帮助吗?感谢你的反馈!