使用另一个类的 JavaFx 应用程序实例

2024-01-16

我有一个如下所示的 MainWindowFx 类。它基本上创建了一个简单的JavaFX GUI.

package drawappfx;


import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.control.TextAreaBuilder;


/**
 *
 * @author Hieu
 */
public class MainWindowFX extends Application{
    public static final int DEFAULT_WIDTH = 600;
    public static final int DEFAULT_HEIGHT = 600;

    private int width;
    private int height;

    private Scene scene;
    private TextArea messageView;
    private Button quitButton;
    private BorderPane layout;
    private Stage primaryStage;

    @Override
    public void start(Stage primaryStage) {
        System.out.println("Started building GUI....");
        this.buildGUI();
        System.out.println("Finished building GUI");
        this.primaryStage = primaryStage;
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(this.scene);
        primaryStage.show();
        System.out.println("Where the hell are you?");
    }

    public Scene getScene() {
        return this.scene;
    }

    public BorderPane getBorderPane() {
        return this.layout;
    }

    public Stage getPrimaryStage() {
        return this.primaryStage;
    }

    public void buildGUI() {
        System.out.println("Before layout");
        this.layout = new BorderPane();
        System.out.println("Before vbox");
        this.layout.setBottom(this.addVBox());
        System.out.println("before new scene");
        this.scene = new Scene(this.layout, DEFAULT_WIDTH, DEFAULT_HEIGHT);
        System.out.println("after new scene");
    }


    public VBox addVBox() {
       VBox vbox = new VBox();
       vbox.setPadding(new Insets(15, 12, 15, 12));

       // message box
       this.messageView = TextAreaBuilder.create()
               .prefRowCount(5)
               .editable(false)
               .build();

       // quit button
       this.quitButton = new Button("Quit");
       this.quitButton.setPrefSize(100, 20);
       System.out.println("think of a good message?");
       vbox.getChildren().addAll(this.messageView, this.quitButton);
       System.out.println("before returning vbox");
       return vbox;
    }

    public void postMessage(final String s) {
        this.messageView.appendText(s);
    }
}

现在我想在另一个类中使用该对象的实例:

package drawappfx;

import java.io.InputStreamReader;
import java.io.Reader;
import javafx.scene.layout.BorderPane;

public class DrawAppFx
{
  public static void main(String[] args)
  {
    final MainWindowFX main = new MainWindowFX();
    BorderPane layout = main.getBorderPane();
    Reader reader = new InputStreamReader(System.in);
    Parser parser = new Parser(reader,layout,main);
    main.start(main.getPrimaryStage());
    parser.parse();
  }    

}

但是当我运行这个时,我遇到了这个错误:

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 com.javafx.main.Main.launchApp(Main.java:658)
    at com.javafx.main.Main.main(Main.java:805)
Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = main
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:237)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:397)
    at javafx.scene.Scene.<init>(Scene.java:287)
    at javafx.scene.Scene.<init>(Scene.java:226)
    at drawappfx.MainWindowFX.buildGUI(MainWindowFX.java:74)
    at drawappfx.MainWindowFX.start(MainWindowFX.java:47)
    at drawappfx.DrawAppFx.main(DrawAppFx.java:39)
    ... 6 more
Java Result: 1

我对此进行了一些搜索,并猜测它与线程有关......但我仍然不知道。有什么建议么?


我已经多次遇到过这个问题,并且有一个相当简单的方法可以解决它。

首先让我向您介绍一下中介者模式 http://en.wikipedia.org/wiki/Mediator_pattern,基本上你想创建一个与你所有的有关系的类GUI

(即不同的 GUI 类彼此之间没有自己的实例,而是所有类都具有对中介器的相同引用)。

现在这是你问题的一个岔路口。

为了更改窗口,您需要通过Stage新窗口应该放置在其中,因此您的代码只需要进行微小的更改:

现在我不经常这样做,但在你的情况下,我会例外,下面的代码包含一个类,你可以“复制粘贴”到你的程序中并使用它来解决代码后的问题,我将准确解释我的内容做过:

Mediator

public class Mediator extends Application {

    private DrawAppFx daf;
    private MainWindowFX mainWindow;
    private Stage primaryStage;
    public Mediator(){
        daf = new DrawAppFx(this);
        mainWindow = new MainWindowFx(this);

    }
    public static void main(String[] args){
        launch(args);
    }
    @Override
    public void start(Stage stage) throws Exception {
        primaryStage = stage;
        mainWindow.start(primaryStage);
    }
    public void changeToDaf(){
        daf.start(primaryStage);
    }
}

现在每个DrawAppFx and MainWindowFx必须有一个传递 Mediator 对象的构造函数,因此有一个“Has-a” 与调解员的关系

这背后的原因是调解器模式现在处于控制之中,如果您创建更多窗口,很容易实现,只需将它们添加到调解器并添加一个调解器可以更改为该窗口的方法。

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

使用另一个类的 JavaFx 应用程序实例 的相关文章

  • 如何加载图像文件到ImageView?

    我试图在从文件选择器中选择图像文件后立即显示该图像文件 文件选择器仅限于 png 和 jpg 文件 所选文件存储在文件类型的变量中 为此 我设置了一个 ImageView 我希望用这个新文件设置图像 唯一的问题是它的类型是文件而不是图像 如
  • JavaFX ScrollPane 样式

    我正在尝试在 JavaFX 中创建一个黑白 ScrollPane 我已经创建了一个 CSS 文件 它工作得很好 除了这个小方块 无论我尝试什么 我都无法将其变黑 这是我的 CSS 文件 scroll pane fx background c
  • Java NoSuchMethodException - 类中确实存在方法

    我正在构建一个 JavaFx 应用程序 我想创建一个接收 GridPane 和 Node 以及添加到窗格中的项目数量的方法 但是 当我调用该方法时 我收到 NoSuchMethodException 作为测试 我尝试创建一个简单的方法pri
  • 如何从具有重复条目的过滤列表中删除特定索引?

    我有一个TableView由一个支持SortedList包裹一个FilteredList包裹一个ObservableList 过滤列表中的项目可以重复 也就是说 有可能是这样的情况list get 5 list get 10 用户可以选择行
  • 从 IntelliJ 运行 JavaFX 应用程序

    Versions openjdk版本 11 0 11 2021 04 20 OpenJDK 运行时环境 build 11 0 11 9 Ubuntu 0ubuntu2 20 10 OpenJDK 64 位服务器虚拟机 内部版本 11 0 1
  • 如何获取JavaFX的版本号?

    如何在运行时找出我正在使用哪个版本的 JavaFX 简单的方法之一就是简单地阅读javafx properties文件位于您的 JAVA HOME jre lib目录 我现在安装了 Java 1 7 u9 与之捆绑的 JavaFX 是 v2
  • Java - ZUI(可缩放用户界面)

    我目前正在做一个小型个人项目 需要显示极其大量的数据 我突然想到实现一种可缩放的用户界面 以允许用户在大量数据中导航 我知道现有的项目 例如ZVTM http zvtm sourceforge net and 短笛2d https code
  • 为什么禁用阶段可调整大小在 javafx 中不起作用?

    当我尝试setResizable对于我在 javaFX 应用程序中的场景 它不起作用 我仍然可以更改窗口大小 这是我的测试应用程序的代码 Override public void start Stage stage throws Excep
  • JavaFX 模块对于 VM 不可见

    我使用 Intellij Idea 作为我的 IDE 由于我需要使用 css 文件 因此我安装了 Intellij Ultimate 现在 javaFx 不适用于它们 抛出异常 boot层初始化时出错 java lang module Fi
  • 更改JavaFX TableView字体大小[重复]

    这个问题在这里已经有答案了 您好 我想在表视图列内的文本上设置字体 我如何用 Java 做到这一点 这是我的代码 感谢帮助 private final TableView
  • JavaFX:setWrapText(true) (WordWrap) 在 ListView 中不起作用

    在 ListView Cell 中激活 WordWrap 时 文本不会换行 这是一个例子 public class ListBug extends Application public static void main String arg
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • JavaFX:使用常量字符串前缀绑定 StringProperty

    我对 JavaFX 中的绑定功能有疑问 我想要的是绑定 2 个字符串属性 但他们的价值观不应该是平等的 让我举个例子 我有一个 StringProperty 代表我的应用程序中最后打开的项目 该值类似于 C temp myProject p
  • JavaFx GridPane布局如何为行中的元素设置边距?

    我正在使用 GridPane 布局在我的应用程序中定位事物 我想知道如何为 row 中的元素设置边距 GridPane setConstraints chip5 1 1 1 1 HPos RIGHT VPos TOP I want to s
  • 将TableView数据显示到另一个窗口中包含JavaFx中的TextField

    我制作了两个 Fxml 文件 一个包含 TextField 另一个包含 TableView 它有它的 Controller 类 我想在执行鼠标单击操作事件时显示从 TableView 到 TextField 的数据 但我们没有得到结果 它显
  • JavaFX 拖放无法正常工作

    我在网格窗格中使用两个 Imageview 进行拖放测试 我的问题是 当我完成拖放并将目标图像视图移动到源图像视图并释放鼠标时 我错误地最终显示了 img2 中的图片 而不是 img1 中的图片 当我注释掉 setOnDragExited
  • 如何在JavaFX中有效地滚动和缩放大图像?

    作为图像处理应用程序的一部分 我需要创建具有缩放 滚动和矢量叠加功能的简单查看器模块 图像相当大 40000x20000 这使得 ImageView 上的操作变慢 缓冲等 在 JavaFX 中处理巨大图像时 改善用户体验的最佳选项是什么 我
  • JavaFX ImageView 未更新

    因此 我尝试将图像加载并保存到 imageView 中 其中图像的位置是通过文件浏览器选择的 我已经为此工作好几天了 如果我不能解决这个问题 我就会中风 我已经尝试了我能想到的一切 预先感谢您的帮助 UPDATED 这是我的主要课程 pub
  • JavaFX 脚本和 Java

    简单的问题 我可以在桌面应用程序中混合 Java 和 JavaFX Script 代码吗 如果可能的话 您能给我提供一些示例链接吗 或者我可以将定制的 javafx CustomNode s 打包在 jar 中 并在我的项目中与标准 SWI
  • 如何设置菜单按钮和菜单项的样式

    我尝试更改菜单按钮中的样式 我可以更改菜单按钮样式 但不能更改其菜单项 无论我尝试什么 菜单按钮内的菜单项都保持不变 menu button fx background color black menu button label fx ba

随机推荐

  • Angular:从外部访问 ng-content 嵌套组件方法

    我有两个共享组件 我希望父组件调用其子组件中的方法 共享组件 1 父组件 Component selector parent template div div div div
  • 在 ffmpeg 中将 2 个音频文件与一个视频合并

    我正在尝试合并 2 个音频文件 wav带视频文件 mp4 产生输出video mp4使用 ffmpeg 进行扩展Windows CMD 这是我尝试过的 ffmpeg i V MP4 i A1 WAV i A2 WAV map 0 v map
  • 在 C# 中检测多个同时按键

    我希望通过检测某些无法键入的组合键 转义序列 的按键来模拟 C 中的串行通信的超级终端功能 例如 Ctrl C Ctrl Z 等 我知道这些键有其 ASCII等价物 并且可以按原样传输 但我在检测多个按键时遇到问题 我提供一些代码作为参考
  • 顶部导航已隐藏

    当我滚动到页面底部并看到页脚时 我不希望隐藏导航顶部 下面是滚动之前的状态 Below is a screenshot when scrolling down to the page 这是代码
  • 从 int 中获取单个字节

    我得到了一个 int 数 例如 5630 十进制 二进制数是 00000000 00000000 00010101 11111110 我想获得十进制的第二个字节 00010101 我怎样才能得到它 您可以使用BitConverter Get
  • 有哪些类型的测试?

    我总是独自工作 我的测试方法通常是经常编译 并确保我所做的更改工作良好 如果不工作则修复它们 然而 我开始觉得这还不够 我对标准类型的测试感到好奇 有人可以告诉我基本测试 每个测试的简单示例以及为什么使用它 测试什么吗 Thanks 不同的
  • 使用故事板时,IBoutlets 很快为零

    在我的一个ViewControllers 当我到达viewWillAppear 我所有的IBOutlets are nil 我尝试查看 matt的解决方案 但它适用于笔尖而不是故事板 这只是当我在 iOS 7 设备上运行应用程序时出现的问题
  • 重新打包 .jar 文件

    我需要将 JRE7 库中的一些 jar 添加到我的 Android 项目中 但例如rt jar与以下内容相冲突android jar来自 Adroid 2 2 SDK 所以我收到此错误 不明智或错误地使用核心类 java 或 javax 当
  • 适用于 Linux 和 PHP 5.4 的 MSSQL Server 本机 ODBC 驱动程序

    我在 Linux Debian 6 x64 上有 Apache 2 2 16 和 PHP 5 4 3 要安装适用于 Linux 的 MSSQL Server 的本机 ODBC 驱动程序 我使用以下说明 http www codesynthe
  • 如何强制重新编译 Linq to SQL 查询的执行计划?

    我有一个动态创建的 LINQ to SQL 查询 有趣的是 当我在 SQL Management Studio 中运行它时 速度快如闪电 当我从 L2S 运行它时 一段时间后它变得非常慢 这可能是由于查询计划 执行计划造成的 当我重新启动
  • 连接两个表时索引如何提高性能

    在我们的一篇练习论文中 我们被问到了标题中的问题 我读过的大多数文章都说索引可以提高连接的性能 但没有告诉我如何提高 也许这是显而易见的事情 不需要说明 索引本质上是对列进行排序 对吗 所以我想按顺序排列一列会更容易操作 还有更多吗 还是我
  • 以简单的方式将 SQL 转换为 SQLite? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我的问题 有人有一种超级简单的方法在
  • 主机名未解析为本地 IP 地址

    我正在 vmware Fusion 中运行 Windows 8 虚拟机 它在运行 OSX 10 10 Yosemite 的 Mac 内运行 VM 的计算机名称为 Proud 当我从内部 ping 虚拟机时 即ping a 192 168 0
  • 基于逗号分隔字符向量列值的Python熔化数据框

    我目前正在进行一项测试 其中有不同的区域和一些相关的统计数据 以及位于这些区域的以逗号分隔的基因列表 该列表的数量是可变的 并且可能不包含任何内容 NA 我怎样才能 融化 这个数据框 region id statistic genelist
  • 使用 Excel VBA 编写和格式化 Word 文档

    我正在尝试使用 Excel VBA 编写 Word 文档 我可以创建一个Word文档 向其中写入文本 更改样式都不是问题 我想做的是将一些文本居中 但我一生都无法弄清楚 这是我用来编写文档的代码 Set wrdApp CreateObjec
  • 显示并关闭模态视图控制器 UIImagePickerController 之后,我的 Cocos2d iPhone 应用程序不再看到多次触摸

    我有一个应用程序 我在其中显示照片选择器 UIImagePickerController 但在用户关闭后 只有单次触摸才起作用 我想我知道问题的根源 但我不知道如何解决它 在显示模式对话框之前 触摸期间的堆栈如下所示 3 0x00074de
  • CakePHP 3 手动安装

    目前我使用 CakePHP 2 6 8 我想迁移到 CakePHP 3 安装指南 http book cakephp org 3 0 en installation html推荐使用Composer 但 Composer 并不能完成所有工作
  • 对数组中每个值的新 API 调用

    我基本上想要这种对象 id 5040 requester id 1234 requester name 约翰 id 5046 requester id 999 requester name 吉姆 id 5049 requester id 5
  • 使用CSS创建水平树

    我有一个数组 用于填充谱系表 它的顺序是这样的 3 1 4 5 2 6 等等 一个例子是http bullybloodlines net dogdetails php name muscletone 27s lucky bam bam of
  • 使用另一个类的 JavaFx 应用程序实例

    我有一个如下所示的 MainWindowFx 类 它基本上创建了一个简单的JavaFX GUI package drawappfx import javafx stage Stage import javafx scene Scene im