应用程序和控制器类之间的 JavaFX FXML 通信

2023-12-11

我试图获取并销毁我在 FXML 应用程序关闭中通过 ProcessBuilder 创建的外部进程,但它不起作用。这是基于有用的建议谢尔盖·格里涅夫给了我这里.

我尝试过使用/不使用“// myController.setApp(this);”来运行并使用“// super.stop();”在子类的顶部和底部(请参阅 MyApp 中该行的注释掉/注释),但没有组合有效。

这可能与 FXML 或 JavaFX 无关,尽管我认为这是在 JavaFX 上开发应用程序的常见模式。我想我正在寻求一种 Java 最佳实践,用于在像这样的基于 UI 的应用程序中关闭相关进程(在本例中:基于 FXML / JavaFX),其中有一个控制器类和一个应用程序类。

你能解释一下我做错了什么吗?或者更好:建议我什么should而是做什么?谢谢。

在我的应用程序中我这样做:

public class MyApp extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader fxmlLoader = new FXMLLoader();
        Scene scene = (Scene)FXMLLoader.load(getClass().getResource("MyApp.fxml"));
        MyAppController myController = (MyAppController)fxmlLoader.getController();

        primaryStage.setScene(scene);
        primaryStage.show();

//        myController.setApp(this);
    }

    @Override
    public void stop() throws Exception {
//      super.stop();

      // this is called on fx app close, you may call it in an action handler too
      if (MyAppController.getScriptProcess() != null) {
        MyAppController.getScriptProcess().destroy();
      }
      super.stop();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

在我的控制器中我这样做:

public class MyAppController implements Initializable {

  private Application app;
  private static Process scriptProcess;


  public void setApp(Application a) {
    app = a;
  }

  public static Process getScriptProcess() {
    return scriptProcess;
  }
}

当我使用“注释掉的 setApp()”运行时的结果not注释掉(即留在启动方法中),启动后立即如下(主场景闪烁,然后消失,然后出现此对话框:

"JavaFX Launcher Error:
Exception while running Application"

它还在控制台中给出了“应用程序启动方法中的异常”。

当我在上面的 MyApp 中省略“注释掉的代码”(即从启动方法中删除“setApp()”)时,结果是我的应用程序does确实关闭了,但是关闭时出现此错误:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
    at javafx.event.Event.fireEvent(Event.java:171)
    at javafx.scene.Node.fireEvent(Node.java:6863)
    at javafx.scene.control.Button.fire(Button.java:179)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336)
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
    at javafx.event.Event.fireEvent(Event.java:171)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3324)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3164)
    at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
    at com.sun.glass.ui.View.notifyMouse(View.java:922)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
    ... 44 more
Caused by: java.lang.NullPointerException
    at mypackage.MyController.handleCancel(MyController.java:300)
    ... 49 more
Clean up...

做法是对的,但是问题很少。

您已经创建了FXMLLoader named fxmlLoader但然后你打电话FXMLLoader.load()这是静态方法,不与您之前创建的实例连接。

另外,使用静态方法进行相互通信也不是很好(想象一下您需要多个进程)。更好的商店myController到一个字段并在stop() method.

更好的方法是向 Controller 添加相应的实用方法并从主应用程序调用它,因为主应用程序似乎不使用Process itself.


这是简短的应用程序来演示所有描述的内容:

public class DoTextAreaLog extends Application {

    private LoggController controller;

    @Override
    public void start(Stage stage) throws IOException{
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("logg.fxml"));
            VBox root = (VBox)fxmlLoader.load();
            controller = (LoggController) fxmlLoader.getController();

            stage.setScene(new Scene(root, 400, 300));
            stage.show();
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        controller.destroy();
    }

    public static void main(String[] args) { launch(); }
}

控制器:

public class LoggController implements Initializable {

    @FXML private TextArea textarea;

    @FXML private void onAction(ActionEvent event) {
        destroy();
    }

    private Process p;

    public void destroy() {
        if (p != null) {
            p.destroy();
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        try {
            p = new ProcessBuilder("ping", "stackoverflow.com", "-n", "100").start();

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        try (BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
                            String line;

                            while ((line = bri.readLine()) != null) {
                                log(line);
                            }
                        }
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }).start();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void log(final String st) {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                textarea.setText(st + "\n" + textarea.getText());
            }
        });
    }
}

日志.fxml:

<VBox id="root" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml"  fx:controller="fxml.LoggController">
    <TextArea fx:id="textarea"/>
    <Button text="Stop The Madness!" onAction="#onAction"/>
</VBox>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用程序和控制器类之间的 JavaFX FXML 通信 的相关文章

  • 使用java代码获取FXML文件节点

    如何使用 FXML 文件获取元素或节点Java 我知道使用方法初始化或通过设置控制器FxmL 中的类 但我需要在没有任何控制器的情况下完成它 我想使用访问 fxml 文件内的节点 我的 FXML 代码 HBox fx id hbx id h
  • 在 JavaFX 上的按钮中加载 SVG 文件

    我在 Inkscape 中创建了一个 SVG 图像 我把它放在与我的班级相同的目录中 有没有办法加载该图像并将其转换为 SVG 路径 这背后的想法是获得该图像getClass getResource image svg toExternal
  • 如何让JNLP下载正确版本的JavaFX 2?

    JavaFX 2 高度依赖本机代码 对于我的桌面应用程序 我想为每个受支持的操作系统选择最匹配的 JavaFX 风格 以使目标系统上的安装尽可能轻松 由于 JavaFX 2 附带了几个 Ant 任务来帮助部署 我认为这是可行的方法 但我似乎
  • 从 Javafx2.2 迁移到 Javafx8

    我正在尝试将 Javafx 2 2 应用程序迁移到 Javafx 8 我在使用嵌套时遇到以下问题FXML javafx fxml LoadException Root hasn t been set Use method setRoot b
  • JavaFX 中的字段验证[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 fxml 创建了一份注册表单 现在我想实现字段验证功能 我正在尝试实现 TextField 的验证 但仍然没有得到它 不幸的是
  • 如何在 fxml 项目中使用 font Awesome (javafx)

    我想在我的项目中使用 font Awesome 字体 但我不知道如何在我的项目中使用 font Awesome 我找到了一些示例 但它们不能在 fxml 中使用 很棒的javafx字体 https bitbucket org Jerady
  • ProcessBuilder的正确使用

    经过研究 我注意到使用 java 的 ProcessBuilder 的 正确 方法是生成另外两个线程来管理新创建进程的 stdout stderr 的吞噬 这样它就不会挂起 如下所示 java世界文章 http www javaworld
  • 如何将JavaFX嵌入到eclipse rcp视图中

    我正在尝试从简单的 Eclipse 视图中使用 JavaFX 2 但我得到了一个 java lang UnsatisfiedLinkError 类的 URL 无效 bundleresource 435 fwk1827795025 com s
  • JavaFX Node.lookup() 仅对使用 FXMLLoader 加载的 Parent 中的某些元素返回 null

    我从 FXML 加载了一个父级 将其添加到场景 舞台内的窗格中并显示它 然后立即查找组件 Lookup 对某些返回 null 但对其他返回非 null 什么情况下会这么做 这是加载和查找代码 rootUi FXMLLoader load g
  • JAVA FXCollections LoadException 类不是有效类型

    我正在尝试在此帮助下实现带有一些数据的 TableViewTutorial https docs oracle com javafx 2 fxml get started fxml tutorial intermediate htm CIA
  • 如何获取javafx imageView中显示图像的宽度/高度?

    我需要获取 imegView 中显示图像的宽度 高度 并将其与 imageView getImage getWidth getHeight 中的原始图像大小进行比较 并在用户从应用程序 GUI 中调整其大小时监听更改 I get this
  • 企业 Web 应用程序中的 JavaFX - 经典网页的良好替代方案?

    我们为不同的客户开发了多种 Web 应用程序 从为那些可怜的管理员提供的简单 看起来很无聊的 CRUD 风格的 GUI 到为那些互联网用户提供的奇特的 AJAX 增强型 GUI 所有这些都基于 JSF 1 2 与 JBoss Seam 2
  • JavaFX 全屏 - 根据屏幕尺寸调整元素大小

    有没有什么方法可以使全屏 如果可能的话也调整大小 而不是重新排列所有内容 实际上它所做的是重新排列元素 例如调整大小但调整到整个屏幕 以形成实际的全屏模式 就像通常改变屏幕分辨率的游戏一样 以便按钮和文本根据屏幕 窗口的大小相应增长 另外
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • 标签文字位置

    我有一个带有图像和文本的标签 final Label label new Label labelText label setTextAlignment TextAlignment CENTER ImageView livePerformIc
  • JavaFX HTMLEditor - 插入图像功能

    我正在使用 JavaFX 集成的 HTMLEditor 它具有的所有功能都很好 但我还需要具有在 HTML 文本中插入图像的功能 你知道我可以使用的一些来源吗 或者其他一些可以在 JavaFX 中使用的 HTML WYSIWYG 编辑器并且
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 场景生成器删除 fxml 文件中的导入

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

    我已经尝试了很多 但无法将数据库中的所有值填充到我的组合框表格单元格中 控制器 java public class controller GetConnection gc new GetConnection PreparedStatemen
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision

随机推荐

  • Chart.js v2:甜甜圈内甜甜圈之间的空间

    我正在使用 Chart js v2 5 0 我把甜甜圈放在甜甜圈里面 我想要两个甜甜圈之间的距离 A 变大而不影响同一甜甜圈内切片之间的距离 B 请看下图 目前我正在使用该房产边框宽度 然而 这也会影响宽度B 请看下面的代码 options
  • 为什么 akka 需要不可变消息

    或者换句话说 可变消息是否有正确的用途 我面临的用例是我想要处理基本上属于类型的对象 Map
  • SimpleHttpOperator Airflow,数据模板化

    我正在尝试正确渲染data里面一个SimpleHttpOperator在 Airflow 中 并通过我发送的配置dag run result SimpleHttpOperator task id schema detector http c
  • `%in%` 和 `==` 有什么区别?

    df lt structure list x 1 10 time c 0 5 0 5 1 2 3 0 5 0 5 1 2 3 Names c x time row names c NA 10L class data frame df df
  • 关于Struts2中的Action映射 - 没有映射Action

    我正在尝试运行我的 struts 应用程序 但收到错误操作未映射我已经看到名称空间是正确的 但仍然收到错误 struts xml
  • 响应式 2 列 CSS 布局,包括固定宽度的侧边栏?

    在任何地方都找不到这个问题的解决方案 我猜这一定是一个非常常见的问题 我正在创建一个带有侧边栏的响应式设计 其中侧边栏需要具有 200px 的固定宽度 并且高度未知 我怎样才能使主要内容区域占据所有剩余宽度 而不会出现任何异常行为 我最接近
  • 如果 scalatest 中的 FunSpec 的 afterEach 测试失败,如何确定

    在使用 FunSpec 的 scalatest 中 我有一些在 afterEach 中触发的代码 我想仅在测试失败时执行一些代码来获取屏幕截图 我所看到的几乎所有内容都试图通过将断言放入 try 块中来解决这个问题 这看起来很糟糕 Test
  • 如何等待回调函数返回?

    我正在使用phonegap 制作一个android 应用程序 我正在使用phonegap 的Storage api 来查询数据库 这是我的代码 function directPath src dest var db window openD
  • 自动调整文本输入框html大小

    我创建了一个输入 键入文本 框并使其自动调整大小非常简单 但是 有一些我似乎无法修复的故障 当我开始打字时 盒子缩小了一点 当我按退格键 或方向箭头 时 该框首先展开 然后在我继续键入时缩小 这是我的代码 function Expander
  • 反转生成的 vtable 函数顺序(具有相同名称的函数)

    如果使用 Visual Studio 2019 我使用两个具有相同名称但不同参数的虚拟方法来编译此 C 代码 struct MyStruct virtual void foo float 0 virtual void foo int 0 c
  • VBA中字符串的串联和最大长度,访问

    我在 access vba 中的字符串方面遇到了严重的问题 问题是 access 有时 将字符串的长度限制为大约 255 个字符 但是 根据字符串的构建方式 它可能会增长到超过 255 个字符 有一个工作代码的示例 Dim strReq a
  • 将父鼠标事件应用于子元素

    我正在制作小型 Windows 窗体应用程序 我里面有 PictureBox 父 和 Label 子 父元素的鼠标事件工作正常 但子元素生成的鼠标事件不会反映在父元素上 光标也会变回默认值 箭头 是否有可能pass由子控件生成的事件 例如M
  • 条件 SQL 计数

    创建计算表中数据出现次数的列的最佳方法是什么 表格需要按一列分组 我的数据库是 PostgreSQL 我见过 SELECT sum CASE WHEN question1 0 THEN 1 ELSE 0 END AS ZERO sum CA
  • Python 标准库,信号 :: AttributeError:模块“信号”没有属性“SIGALRM”

    我正在尝试设置函数超时 但是没有成功 我运行示例代码https docs python org 3 library signal html highlight signal 20sigalrm example 但是 我得到Attribute
  • Firebase Angular2 - 如何在没有太多开销的情况下查询和渲染列表

    在我的应用程序中 我有以下 firebase posts 结构 posts text meta user id user1 username 我正在使用 AngularFire2 因此 为了获取特定用户发布的所有帖子 我运行以下查询 thi
  • jQuery .html() 和里面的变量

    我想把变量FLC放在里面 FNC html 但不知道怎么做 有什么建议吗 DEMO var FLV random input box val FNC html
  • 非成员函数是否可以返回 const 值?

    如果是这样 怎么办 这个问题还有道理吗 就我而言 调用者修改返回的对象是没有意义的 因此我想将其标记为不可修改 const MyClass foo 是有效的 但返回 const 值没有意义 无论如何它都会被复制 您可以返回 例如常量引用 c
  • 循环在第一次后跳过 scanf 语句

    这是 main 的代码 int main void float acres 20 float bushels 20 float cost 0 float pricePerBushel 0 float totalAcres 0 char ch
  • WireMock 可以回放来自多个域的请求吗?

    我正在构建一个 Docker 化的记录播放系统来帮助我记录网站 这样我就可以根据本地版本而不是真实版本来设计抓取工具 这意味着我不会用自动请求淹没网站 并且具有不需要连接到网络即可工作的额外优势 我在内部使用了基于 Java 的 WireM
  • 应用程序和控制器类之间的 JavaFX FXML 通信

    我试图获取并销毁我在 FXML 应用程序关闭中通过 ProcessBuilder 创建的外部进程 但它不起作用 这是基于有用的建议谢尔盖 格里涅夫给了我这里 我尝试过使用 不使用 myController setApp this 来运行并使