You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:32:43