跳到内容
CrossFly 是 100% 开源在 GitHub 关注我们
CrossFlyCrossFly
开始使用

本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。

如何打开和关闭一个屏幕

目的。 在 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 线程之外是安全的:它会转发到绘制线程并等待。

深入了解

这个页面有帮助吗?