Clojure 无法导入带有静态初始化器的 JavaFX 类

2024-02-02

我正在使用 Clojure (1.6) 和 JavaFX 8,一开始我就遇到了问题。例如,这个非常简单的代码失败了:

(ns xxyyzz.core)

(gen-class :name "xxyyzz.core.App"
           :extends javafx.application.Application
           :prefix "app-")

(defn app-start [app stage]
  (let [button (javafx.scene.control.Button.)]))

(defn launch []
  (javafx.application.Application/launch xxyyzz.core.App (into-array String [])))

(defn -main []
  (launch))

这是堆栈跟踪的最后一部分似乎相关:

Caused by: java.lang.ExceptionInInitializerError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:340)
        at clojure.lang.RT.classForName(RT.java:2070)
        at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:969)
        at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:747)
        at clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2494)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
        ... 48 more
Caused by: java.lang.IllegalStateException: Toolkit not initialized
        at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276)
        at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271)
        at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:562)
        at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:524)
        at javafx.scene.control.Control.<clinit>(Control.java:81)
        ... 55 more

我根本不会说 Java,但研究一下,问题似乎出在 Clojure 及其导入 Java 类的方式上。如果我理解正确的话,在导入时它会运行类静态初始化程序,并且对于某些 JavaFX 类(Button就我而言)会崩溃。

我想我有两个问题:我对这个错误的理解是否正确?其次,有没有办法以某种方式解决这个问题?我尝试将导入拉入函数内部,而不是在 (ns) 声明处,但它仍然不起作用。

如果没有 Clojure 修复,是否可以通过一些额外的 Java 代码来修复?

欢迎任何提示和指示!


我找不到改变 Clojure 导入行为的方法,但我确实找到了一些技巧来完成我需要的操作。

首先,JavaFX 提供了构建器类,因此在这种特殊情况下最干净的方法是使用ButtonBuilder创建新按钮。

第二种方法是编写一个简单的 Java 类来包装Button,然后从 Clojure 一侧导入该包装类。当处理少量有问题的类时,这是一个不错的解决方案。

第三种方法是在运行时导入,如下所示(感谢 #clojure 的人员帮助解决此问题):

(defn import-at-runtime [name]
  (.importClass (the-ns *ns*)
                (clojure.lang.RT/classForName name)))

(import-at-runtime "javafx.scene.control.Button")

(let [button (eval `(new ~(symbol "javafx.scene.control.Button") ~"Button Text"))

最后,这看起来像是 Clojure 的 Java 互操作中的一个丑陋的疣,如果将来能够修复它那就太好了。


更新:还有clojure.lang.RT/classForNameNonLoading https://github.com/clojure/clojure/blob/clojure-1.6.0/src/jvm/clojure/lang/RT.java#L2073,但不幸的是,它不是public从 Clojure 1.6 开始。不过,在 Clojure 中重新实现它很容易:

(fn [^String class-name]
  (Class/forName class-name false (clojure.lang.RT/baseLoader)))

稍后,该类可以实例化为clojure.lang.Reflector/invokeConstructor.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clojure 无法导入带有静态初始化器的 JavaFX 类 的相关文章

  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 在JavaFX中如何在表视图中添加带有数据的组合框

    我已经尝试了很多 但无法将数据库中的所有值填充到我的组合框表格单元格中 控制器 java public class controller GetConnection gc new GetConnection PreparedStatemen
  • JavaFX 中的自定义双向绑定

    我正在尝试实现一个涉及 2 个字段计算的 GUI 我的模型有 2 个属性和 1 个绑定 ObjectProperty
  • Clojure 缩减函数的目的

    clojure 的目的是什么reduced函数 在 Clojure 1 5 中添加 https clojure github io clojure clojure core api html clojure core reduced htt
  • JavaFX 2 XYChart.Series 和 setOnMouseEntered

    是否可以设置 XYChart Series 的实例来作用于 setOnMouseEntered 在我看来 使其工作的一个前提条件是实现 EventTarget 接口 至于JavaFX XYChart Series 当光标触摸黄线时 我想突出
  • 无法将 intellij 的 scenebuilder 与 jfoenix 一起使用

    我使用 java 9 0 4 创建了一个 javafx 项目 该代码可以编译并运行 我可以使用内部场景构建器 但是当我从 Jfoenix 9 0 1 库导入元素时 我无法再使用 sceneBuilder 我收到此错误 java lang U
  • Clojure实现多线程的最佳方法?

    我正在开发一个用 Clojure 编写的 MUD 客户端 现在 我需要两个不同的线程 一种接收用户的输入并将其发送到 MUD 通过简单的套接字 另一种读取 MUD 的输出并将其显示给用户 我应该只使用 Java 线程 还是应该使用一些特定于
  • JavaFX 应用程序隐藏 OSX 停靠图标

    我需要隐藏 javafx 应用程序的停靠图标 在普通的 java 应用程序中 这可以通过以下属性来实现 System setProperty apple awt UIElement true 然而 这似乎不适用于 JavaFX Thanks
  • 如何在 Clojure 中创建循环(且不可变)数据结构而不需要额外的间接?

    我需要在 Clojure 中表示有向图 我想将图中的每个节点表示为一个对象 可能是一条记录 其中包含一个名为 edges这是从当前节点直接可达的节点的集合 希望这是不言而喻的 但我希望这些图表是不可变的 我可以构造有向acyclic只要我进
  • 在 Clojure 中的函数上使用“apply”时,如何显式指定名称空间?

    这里的 graph 是高阶函数 它返回一个在其范围内设置了配置的函数 ns bulbs neo4jserver graph defn out1 Test func that simply returns out1 config out1 d
  • 惰性序列内部究竟如何工作

    我是 clojure 的新手 不清楚惰性序列在内部是如何工作的 或者更具体地说 返回惰性序列的函数意味着只有在需要时才会计算结果 例如在下面的例子中 defn fc lazy fn xs lazy seq if let xss seq xs
  • JavaFX:如何在 JavaFX 中正确使用 ProgressIndicator

    我是 JavaFX 新手 我的 JavaFX 应用程序有问题 我需要在数据库查询之前启动 ProgressIndicator 类型 INDETERMINATE 这是我的代码的一部分 spinner setVisible true passC
  • JavaFX TabPane 禁用按键切换选项卡

    我有一个Tab有一些内容 ScrollBar和别的 The ScrollBar has event handler for keys left and right 但如果我按下这些按钮Tabs被切换 因为TabPane还有一个密钥处理程序
  • Clojure:对于 n 维

    Clojure 中的函数for可用于迭代嵌套序列 想象一个具有 x y 和 z 轴的 3D 空间 for x range 10 y range 5 z range 2 x y z 上面的代码将生成一个向量序列 表示长方体内所有可能的位置 当
  • 如何在 JavaFX 中对单选按钮的最大可选复选框进行限制?

    请看下面的图片 您就会了解我的应用程序的布局 我希望能够动态选择多少CheckBox 启用下拉菜单 是可选的 固定数量 我想用这 3 个人来实现这个目标RadioButton 在垂直模式下全部 4CheckBox必须选择 不少于 在混合模式
  • JavaFX 按钮不会禁用

    我有一个可能需要几秒钟到几分钟的任务 当我单击按钮执行该任务时 它会运行该任务但并不总是禁用按钮A和启用按钮B 这是我正在使用的代码 FXML public void onExecute ActionEvent event btnExecu
  • Mac OS X 下的 JavaFX:系统菜单和模态窗口

    我目前面临 Mac OS X 下的 JavaFX 菜单和模式对话框的问题 我正在使用该方法 MenuBar setUseSystemMenuBar true 为了将系统菜单栏用于我的应用程序菜单 这工作正常 但如果模式对话框打开 菜单不会被
  • 我应该如何使 Clojure STM 程序持久化?

    我正在编写一个使用 STM 的 clojure 程序 目前 我在启动时从数据库填充 STM 使用引用 然后在 dosync 事务成功时异步更新数据库 我不知道我是否以正确的方式这样做 或者是否有更好的标准技术来做到这一点 谁能向我解释一下他
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 如何在 REPL 中显示 Clojure 中函数的定义?

    我正在寻找让 REPL 打印函数当前定义的能力 有什么办法可以做到这一点吗 例如 给定 defn foo if true true 我想说类似的话 print definition foo 并得到一些类似的东西 foo if true tr

随机推荐

  • 更新 MKannotation 图像而不闪烁

    我想每 5 秒更新一次地图视图上的一些注释的图像 但是我不想将它们删除并重新添加到地图中 因为这会导致它们 闪烁 或刷新 即消失然后重新出现 我希望它是无缝的 我尝试过以下方法 get the current icon UserAnnota
  • Ruby 日期格式验证

    如何验证日期 2016 01 01 的格式是否正确 Y m d 例如我想得到true or false日期格式是否正确 伪代码 if 2016 01 01 Y m d puts date is valid else puts date is
  • 如何在 UPDATE 子句中使用 ROW_NUMBER()? [复制]

    这个问题在这里已经有答案了 ROW NUMBER 仅适用于SELECT中的条款MS SQL Server 但我想用它进行更新 如下所示 Update MyTab Set MyNo 123 ROW NUMBER over Order By I
  • Z80 ASM BNF 结构...我走在正确的轨道上吗?

    我正在尝试学习 BNF 并尝试汇编一些 Z80 ASM 代码 由于我对这两个领域都是新手 我的问题是 我是否走在正确的道路上 我正在尝试将 Z80 ASM 的格式编写为 EBNF 以便我可以弄清楚从那里到哪里从源代码创建机器代码 目前我有以
  • Express - POST 和 PUT 上的 400 个错误请求

    我需要一些帮助 因为我是 Node js 和 Express 的新手 我正在 Postman 上测试以下代码 const Joi require hapi joi const bodyParser require body parser L
  • OS X - 谁能解释为什么我在安装 ipython3 后在 .pythonrc.py 文件中遇到操作系统错误,或者给我一个比这更强大的解决方案?

    我使用 pip3 安装了 ipython3 pip3 install ipython all 当我运行 python 时 我的 pythonrc py 文件遇到错误 仅在 Python 3 上 不在 Python 2 上 Python 3
  • 对每列的单行进行采样,其中存在大量缺失数据

    作为我的数据框的示例 我将其称为df1 我的 GROUP1 包含三行数据 GROUP2 包含两行数据 我有三个变量 X1 X2 和 X3 GROUP X1 X2 X3 GROUP1 A NA NA GROUP1 NA NA T GROUP1
  • 嵌套“if”-“else”语句

    我的代码非常混乱if else如果检查它正在做什么 分支和嵌套分支的数量相当大 超过 20 个 if else if 和嵌套 它使我的代码更难阅读 并且可能会消耗性能 我的应用程序检查从用户那里获得的许多条件 因此应用程序必须始终检查不同的
  • Xamarin 上的空白屏幕

    我有一个 Xamarin 便携式项目 我调试的 Xaml 页面完全是空白的 我在 Android 和 IOS 上都看不到页面上的任何组件 我怎样才能解决这个问题 Note 它没有收到任何错误消息 页面正在打开 但我看不到任何内容 问题发生在
  • Oracle.Dataaccess 位于 GAC 中。我可以控制我使用的版本吗?

    我有一个使用 Oracle DataAccess ODP NET 的 XCOPY 可部署 NET 应用程序 我们还在应用程序目录中部署 Oracle Instant 客户端 一切正常 但我担心 来自 Oracle ODP NET 常见问题解
  • 实体框架 5 - 从实体迁移和创建表

    我正在使用 Entity Framework 5 RC 并且我有一些代码需要数据库上的特定表 该实体已使用 Code First 创建 a 如果数据库中尚未创建表 是否有办法告诉 EF 创建该表 如果是的话 怎么办 b 另外 如果表已经存在
  • Intellij IDEA插件中将虚拟文件同步到物理文件

    我正在实现 Intellij IDEA 插件 该插件需要在执行操作之前保存文件 Action是shell命令 它需要将文件名作为命令行参数传递 AFAIK Idea 在框架停用时保存 同步 文件 因此如果我右键单击该文件 然后单击我的操作
  • 如何在 Ansible 中打破循环?

    想要在 item 的值变为 7 后中断任务 这里是示例任务 hosts localhost tasks shell echo item register result with sequence start 4 end 16 when it
  • 检索 Instagram 图像 - 获取访问被拒绝消息

    创建了一个应用程序来从 Twitter 休息提要中检索 Instagram 图像 正常情况下它可以工作 但偶尔会收到来自 Instagram CDN 的 访问被拒绝 消息 例如 http distilleryimage2 s3 amazon
  • Rails 3.1 活动记录插入或更新

    我是铁路新手 活动记录中是否有一种简单的方法可以向其传递数据散列 如果记录存在 则更新它 如果不存在 则创建它 data data my id 356345 data description test123 w Descriptions n
  • 是否可以在 Mono 上运行 ASP.NET MVC 3 应用程序?

    我需要在 Linux 运行服务器上运行一些 MVC 3 应用程序 似乎唯一的选择是 Mono 该网站仅讨论 Web 服务 但我想知道运行整个 MVC 3 应用程序也是可能的吗 谢谢 这取决于 整个 mvc 3 应用程序 的含义 ASP Ne
  • nhibernate queryover LIKE 与表达式树

    我希望向我的基本存储库类添加一个方法 该方法允许我使用LIKE表达式 但我不太确定如何去做 我想创建一个通用方法 它查看传入的表达式树并在传入的字符串值中查找通配符 然后它将生成QueryOver相应声明 我目前有以下内容 public I
  • (新格式)Visual Studio 项目中的可选 appsettings.local.json

    我的应用程序使用 appsettings json 进行某些设置 如果 appsettings local json 存在 则应覆盖 appsettings json 中包含的任何设置 到目前为止 没有问题 但我使用 git 进行版本控制
  • 如何从android模拟器访问localhost?

    我正在通过本教程学习 Xamarin 如果用邮递员发送请求 一切正常 但如果我想使用 android 模拟器 它就不起作用 而且我无法使用 UWP 因为必须启用开发人员模式 而且我在公司计算机上没有管理员权限 我在我的私人计算机上启用了开发
  • Clojure 无法导入带有静态初始化器的 JavaFX 类

    我正在使用 Clojure 1 6 和 JavaFX 8 一开始我就遇到了问题 例如 这个非常简单的代码失败了 ns xxyyzz core gen class name xxyyzz core App extends javafx app