当前位置: 首页 > 面试题库 >

如何将FX控制器与主应用程序连接

阴宏爽
2023-03-14
问题内容

我有一个主应用程序类和一个fxmlController类,但我纠结于连接/组织(混淆了如何调用它们以及如何组织它们以使GUI连接业务逻辑)业务逻辑和GUI。有人可以告诉以下函数调用的顺序吗?有人可以帮助我如何调用它们吗?

主班:

public void Main()        //constructor
public static void main() // our main
public void start()       //I don't know what it is, what purpose it has
                          // and where should be called
                          //Note: In main function there is a call as following

fxmlController类:

public void initialize()  //I don't know what it is and what purpose it has
public fxmlController()   // which function should be called here....

注意:我知道FXMLLoader();请有人解释


问题答案:

我认为FXML文件及其对应的控制器是一对管理用户界面的控制器。在较大的应用程序中,您可能有几对这样的FXML-
controller对构成了用户界面的不同部分。在每对中,FXML文件定义UI的布局,而控制器定义逻辑(即,它通常处理用户输入等)。

当您说自己“知道FXMLLoader”时,如果您完全了解您的意思,那么您实际上会理解您所询问的其他一些内容,因此:

由FXML文件及其控制器定义的用户界面由加载到内存中FXMLLoader。在最简单的设置中,控制器由fx:controllerFXML文件的根元素中的属性定义。在load()上调用方法FXMLLoader时:

  1. 加载FXML文件
  2. fx:controller通过调用属性的无参数构造函数来创建该属性指定的控制器类的实例
  3. @FXML将控制器中任何带注释字段的值设置为使用匹配fx:id属性定义的元素
  4. 注册任何映射到控制器中方法的事件处理程序
  5. 调用initialize()控制器上的方法(如果有)。

注意这些事件的顺序:构造函数被调用 之前
@FXML-annotated领域注入,但initialize()方法后调用。这意味着您可以@FXMLinitialize()方法中访问(和配置)和带有注释的字段,但不能在构造函数中访问。在控制器类中不定义任何构造函数而仅使用默认值是很普遍的(至少在简单的应用程序中)。

您的应用程序中可以根据需要/想要有尽可能多的FXML
/控制器对。每个FXML文件应具有其自己的控制器类。如果要定义FUI的多个UI实例,则可以根据需要多次加载FXML文件:每次FXMLLoader都会为您创建一个与所加载的UI元素相关联的新控制器实例。

Application子类(你叫它Main)代表整个应用程序。每个应用程序只能有一个这样的类,而只能由FX工具箱为您创建一个实例。

当您启动FX应用程序时(我将在下面进行描述),将启动FX工具包。然后,Application创建您的子类的实例,并init()调用其方法(如果未定义,则默认实现不执行任何操作)。然后启动FX
Application线程,并在该线程上调用Application子类实例的start()方法。

您的start()方法应该做最少的工作。通常,它将加载“主要”
fxml文件,将生成的UI放置在场景中,将场景放置在舞台中,然后显示舞台。所有逻辑将由FXML文件的控制器处理,而不是由Application子类处理。

在更高级的应用程序中,您可以在您的init()方法中启动一些后台服务和/或创建一些数据模型,然后将它们与该start()方法中的控制器连接,但是上面的想法是基础。

实际的启动过程可以通过两种方式发生。如果使用标准Oracle JRE,则使用以下命令启动Application子类

java Main

(其中Main extends Application)将导致上述过程发生;换句话说,启动了FX工具箱,Main创建了FX的实例,init()调用了它的start()方法,并在FX
Application Thread上调用了它的方法。

其他环境(尤其是IDE)不了解JavaFX启动过程,并希望您正在执行的类具有某种public static void main(String[] args)方法,例如任何标准Java应用程序类。为了支持这些环境,Application子类通常会定义一个main(...)简单调用的方法launch(...)(从继承的静态方法Application)。该launch方法强制FX工具包启动,等等。在任何应用程序生命周期中只能调用一次。

所以现在你有了类似的东西:

package com.example ;

// imports...

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        // just load fxml file and display it in the stage:

        FXMLLoader loader = new FXMLLoader(getClass().getResource("mainUI.fxml"));
        Parent root = loader.load();
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // main method to support non-JavaFX-aware environments:

    public static void main(String[] args) {
        // starts the FX toolkit, instantiates this class, 
        // and calls start(...) on the FX Application thread:
        launch(args); 
    }
}

然后,您将拥有mainUI.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import java.util.ArrayList?>

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.MyController">
    <Label  fx:id="label1"/>
    <Label  fx:id="label2"/>
</VBox>

和控制器

package com.example ;

// imports...

public class MyController {

    @FXML
    private Label label1 ;
    @FXML
    private Label label2 ;

    // called by the FXML loader after the labels declared above are injected:
    public void initialize() {

        // do initialization and configuration work...

        // trivial example, could also be done directly in the fxml:
        label1.setText("Foo");
        label2.setText("Bar");
    }
}


 类似资料:
  • 问题内容: 我已经在Eclipse中生成了Android项目,并且一切正常。我添加了一些事件按钮。现在,我正在尝试创建Mongo对象,但会引发错误。你有什么解决办法吗?是否可以同时连接这两个? 日志: 问题答案: 此驱动程序不支持Android。吉拉有一个未解决的问题。

  • 我的应用程序是用Flatter和Firebase RTDB(数据库1)开发的。它是为IOS和Android构建的。 我有一个使用JS和Firebase RTDB(数据库2)开发的辅助应用程序。它是为Web创建的。 现在,我想从我的Flatter应用程序中写入数据库2。我应该一步一步地做什么? 我尝试使用以下方法应用添加多个项目: 但我不确定这是否是一个安全的过程,我不知道如何调用辅助数据库实例..

  • 问题内容: 我有一个Angular应用程序,我想在ReactJS中编写应用程序的某些部分。 如何将ReactJS应用程序注入现有的Angular应用程序中?我还需要组件的双向通信。 问题答案: 您可能需要其他选项,所以我在第2段中编写了它: 无需通信的Angular-ReactJS 具有双向通信的Angular-ReactJS 下面的所有代码都是最少的,无法在提出的步骤中显示问题。在GitHub上

  • 大家下午好。我通常会自己发现并修正错误,但这次我真的卡住了。我的作业是写一个贷款计算器。所有代码都正常工作,编译也很好,直到我需要创建一个线图/图形,它弹出在一个新窗口中。 问题出在加载FXML文件或将其他控制器连接到主控制器的某个地方。 我尝试了不同的方法,并在不同的论坛上查看了解决方案,但无法在代码中实现。有人能给我提个解决办法吗? 提前感谢你的帮助。 P.S.这些是我试图寻找解决方案的链接,

  • 问题内容: 我正在练习制作一个与PostgreSQL数据库交互的Golang Web应用程序,每个应用程序都在各自的容器上运行。 我正在运行容器 但是我似乎无法正确设置postgres容器。 为简便起见,指向s和其他设置文件的链接位于此要点上(如果您需要在此处,请告诉我)。 工作良好。但是,当应用程序尝试使用以下方法打开数据库连接时: 我从docker compose得到以下错误: 如何使两个容器

  • 本文向大家介绍将SAP SOAP WebService与Android应用程序连接,包括了将SAP SOAP WebService与Android应用程序连接的使用技巧和注意事项,需要的朋友参考一下 您正在像这样在URL中传递参数:http : //XXX.com/xyz/api/sap-client=100&sap-user=username&sap-password=xxxxx“ 取而代之的是