如何在JRubyFX中从控制器获取Window对象并实现多窗口管控
JRubyFX中实现主窗口打开临时窗口并禁用主窗口的解决方案
我明白你在把JavaFX的逻辑迁移到JRubyFX时遇到了get_window方法找不到的问题——这很常见,因为JRubyFX对JavaFX的API做了Ruby风格的封装,很多方法名会变成Ruby式的蛇形命名,或者直接通过属性访问。下面我会一步步帮你实现需求,同时梳理JavaFX到JRubyFX的核心转换要点。
一、核心问题:JavaFX到JRubyFX的方法/属性转换
首先要明确,JRubyFX会把JavaFX的驼峰命名方法转换成蛇形命名,甚至直接提供属性访问方式。比如JavaFX里的getWindow()在JRubyFX里对应的是window属性(直接访问),而不是get_window方法——这就是你报错的核心原因!
给你举几个常见的转换例子,方便你快速上手:
- JavaFX:
node.getScene()→ JRubyFX:node.scene - JavaFX:
stage.setTitle("Title")→ JRubyFX:stage.title = "Title" - JavaFX:
button.setOnAction(e -> { ... })→ JRubyFX:button.on_action { ... }
二、实现需求的完整代码示例
下面是一个可直接运行的JRubyFX代码示例,完美实现你要的“主窗口打开临时窗口并禁用主窗口”的功能:
1. 主窗口控制器代码
require 'jrubyfx' class MainController include JRubyFX::Controller def open_temp_window # 获取主窗口:两种方式任选其一 # 方式1:如果在FXML里给主窗口设置了fx:id="mainStage",直接用@main_stage main_stage = @main_stage # 方式2:如果从按钮触发,也可以从当前控件向上获取 # main_stage = sender.scene.window # 禁用主窗口 main_stage.enabled = false # 创建并配置临时窗口 temp_stage = Stage.new temp_stage.title = "临时窗口" temp_stage.scene = Scene.new(Group.new, 300, 200) do label text: "关闭此窗口后,主窗口将恢复可用" end # 监听临时窗口关闭事件,恢复主窗口状态 temp_stage.on_hidden do main_stage.enabled = true end # 显示临时窗口 temp_stage.show end end
2. 对应的FXML文件(main.fxml)
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.VBox?> <?import javafx.scene.control.Button?> <VBox xmlns:fx="http://javafx.com/fxml" fx:controller="MainController" alignment="CENTER" spacing="20"> <Button text="打开临时窗口" onAction="#open_temp_window"/> </VBox>
3. 应用启动类代码
require 'jrubyfx' class MainApp < JRubyFX::Application def start(stage) stage.title = "主窗口" stage.scene = Scene.new(FXMLLoader.load(File.expand_path("main.fxml", __dir__)), 400, 300) stage.show end end MainApp.launch
三、关键转换要点总结
- 属性访问替代get/set方法:JRubyFX把JavaFX的
getXxx()/setXxx()方法转换成了Ruby的属性,比如getWindow()→window,setEnabled(false)→enabled = false。 - 事件处理的Ruby块风格:JavaFX的
setOnXxx方法在JRubyFX里变成了on_xxx的块写法,比如on_hidden { ... }替代setOnHidden(e -> { ... })。 - 控制器中的元素引用:在FXML里给控件设置
fx:id="xxx",在控制器里可以直接用@xxx访问,不需要手动调用查找方法。 - Stage和Scene的创建:JRubyFX简化了Stage和Scene的创建,支持链式调用或者块写法,更符合Ruby的代码风格。
如果还有其他JavaFX到JRubyFX的转换疑问,随时提出来就好!
内容的提问来源于stack exchange,提问作者benbyday
相关产品推荐
相关产品推荐

