---
title: Crear una ventana propia
summary: Crea una interfaz Lua con frame, tabla, texto, botón y una limpieza correcta.
section: ui
kind: example
status: example
updated: 2026-10-27
tags: ["X4","modding","create","ui"]
sources: ["https://wiki.egosoft.com/X4%20Foundations%20Wiki/Modding%20Support/Breaking%20Changes/"]
---
## Elegir un enfoque
Para un pequeño escenario, considere un [menú de configuración API](wiki:ui-settings). Para añadir una tarjeta o acción a un menú existente, comience con [ampliación de la norma UI](wiki:extend-ui). Una ventana personalizada puede usar Helper para crear un marco, una tabla, filas y widgets, luego mostrarlo. Python y un servicio de red no son necesarios.
## Registrar Lua
Declarar el archivo Lua en su extensión `ui.xml`, Como se muestra a continuación. Espere hasta que Helper y el juego UI están listos antes de abrir la ventana. Cargar un archivo Lua no significa que el mundo y todos los menús ya existen.
```xml
```
## Construir la ventana
El `ui/wiki_panel.lua` un evento separado abre el panel después de la preparación de la UI. Crea un marco en la capa 3, añade una tabla y texto, une un botón Cerrar y muestra el marco. Compruebe las callbacks internas y el uso de la capa contra el juego actual de la UI.
El Director Ejecutivo `raise_lua_event` fragmento pertenece a un `actions` bloque. Su mod suministra el disparador, como un botón de trabajo o un evento. El ejemplo no instala una tecla de acceso rápido automáticamente.
```lua
local menu = { name = "WikiExamplePanel" }
menu.onViewCreated = function() end
menu.onRowChanged = function() end
menu.onSelectElement = function() end
function menu.onCloseElement()
if menu.shown then
Helper.clearFrame(menu, 3)
menu.shown = false
end
end
Menus = Menus or {}
table.insert(Menus, menu)
Helper.registerMenu(menu)
local function showPanel()
if menu.shown then return end
local width = Helper.scaleX(480)
local height = Helper.scaleY(150)
local frame = Helper.createFrameHandle(menu, {
layer = 3,
x = (Helper.viewWidth - width) / 2,
y = (Helper.viewHeight - height) / 2,
width = width, height = height,
standardButtons = {},
startAnimation = false,
playerControls = true,
})
local t = frame:addTable(1, { tabOrder = 1, width = width })
local title = t:addRow(false, {})
title[1]:createText("Hello, X4!", { fontsize = 14 })
local row = t:addRow(true, {})
row[1]:createButton({ height = 28 }):setText("Close")
row[1].handlers.onClick = menu.onCloseElement
menu.shown = true
frame:display()
end
RegisterEvent("Wiki.ShowPanel", function()
showPanel()
end)
```
```xml
```
## Verificar el ciclo de vida
La apertura repetida no debe acumular llamadas. Pruebe el botón Cerrar, el comportamiento del escape/controlador, los cambios de menú y guardar la carga. Una tabla con altura insuficiente puede desaparecer por completo. No limpie el marco de otro menú ni altere el control global del reproductor sólo para mostrar texto. Esta plantilla ilustra los formularios de ayuda y no ha sido probada por separado en las versiones de X4.
Antes de añadir un icono de nivel superior compartido o ganchos UIX de terceros, lea [callbacks y el límite superior del menu](wiki:ui-hooks-and-top-menu). Estos mecanismos tienen limitaciones de compatibilidad separadas.