草庐IT

java - 如何将 FX Controller 与主应用程序连接

coder 2024-03-22 原文

我有一个主要的应用程序类和一个 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 文件及其相应的 Controller 是管理用户界面的一对。在较大的应用程序中,您可能有几个这样的 FXML Controller 对,它们构成了用户界面的不同部分。在每一对中,FXML 文件定义了 UI 的布局,而 Controller 定义了逻辑(即它通常处理用户输入等)。

虽然你说你“知道 FXMLLoader”,但如果你完全理解,你实际上会理解你问的其他一些事情,所以:

由 FXML 文件定义的用户界面及其 Controller 由 FXMLLoader 加载到内存中。 .在最简单的设置中, Controller 由 fx:controller 定义。 FXML 文件根元素中的属性。当load()方法在 FXMLLoader 上被调用, 它:

  • 加载 FXML 文件
  • 创建由 fx:controller 指定的 Controller 类的实例属性,通过调用其无参数构造函数
  • 设置任何 @FXML 的值- 将 Controller 中的注释字段添加到使用匹配 fx:id 定义的元素中属性
  • 注册映射到 Controller 中方法的任何事件处理程序
  • 调用 initialize() Controller 上的方法(如果有)。

  • 注意这些事件的顺序:在 @FXML 之前调用构造函数-注解字段被注入(inject),但 initialize()方法在之后调用。这意味着您可以访问(和配置)和 @FXML - initialize() 中的注释字段方法,但不在构造函数中。在 Controller 类中不定义任何构造函数而只使用默认值是很常见的(至少在简单的应用程序中)。

    您可以根据需要/希望在应用程序中拥有任意数量的 FXML/ Controller 对。每个 FXML 文件都应该有自己的 Controller 类。如果您想要它定义的多个 UI 实例,您可以根据需要多次加载 FXML 文件:每次 FXMLLoader将为您创建一个与您加载的 UI 元素相关联的新 Controller 实例。
    Application子类(您称之为 Main )代表整个应用程序。每个应用程序应该只有一个这样的类和它的一个实例,它是由 FX 工具包为您创建的。

    当您启动一个 FX 应用程序(我将在下面描述)时,FX 工具包就会启动。然后是你的 Application 的一个实例子类被创建,它的 init()方法被调用(如果你没有定义一个,默认实现什么都不做)。然后启动 FX 应用程序线程和 Application子类实例的 start()在该线程上调用方法。

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

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

    实际的启动过程可以通过几种方式发生。如果您使用的是标准 Oracle JRE,则启动 Application子类
    java Main
    

    (其中 Main extends Application )将导致上述过程发生;换句话说,FX 工具包已启动,是 Main 的一个实例。已创建,其 init()方法被调用,它是 start()方法在 FX 应用程序线程上调用。

    其他环境(尤其是 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>
    

    和 Controller
    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");
        }
    }
    

    关于java - 如何将 FX Controller 与主应用程序连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33881046/

    有关java - 如何将 FX Controller 与主应用程序连接的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    7. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    9. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    10. ruby - 在 Ruby 中编写命令行实用程序 - 2

      我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

    随机推荐