javafx非控制类获取控制类的控制器
先看下面的图,以官网的例子说事(我自己写的分包可能比较乱,不容易看明白,官网例子没有分包)
App是启动类,下面有两个控制器,同时也有两个fxml文件对应这两个控制器。对于fxml中定义的组件(按钮、文本框等),如果我们要修改他们的值,比如让某个文本框显示某些东西,我们只能通过与该fxml对应的控制类进行修改。如果需要在其他类修改呢?那就必须获得这个控制器才行。
看我的代码:
我需要在其他类里面调用控制类的方法对界面进行修改(修改只能在控制类修改),可能想到一个很简单的方法,在其他类里面new一个控制类的对象然后调用,然后,这个对象只能调用不是更改页面的方法,如果该方法里面包含了修改页面的代码,不如设置文本框的值,那就会报错。比如下面的代码,对象只有调用test才不会报错,因为它只是简单的输出,并没有关系到页面的改。
前面说了,要修改,就要获取控制器,所以现在 来说一下一个笨拙的方法:把控制器传给其他类。如下,两个 方法分别对应创建连接和断开连接两个按钮的事件处理,当点击按钮时触发事件,方法执行,然后ClientUIUpdate类就拥有了调用控制类的能力,即使调用了关于修改界面的方法也没有问题。这里将控制器传出去一定要写在最前面,否则像代码中创建了客户端对象,该对象调用方法,该方法中有关于页面修改的代码,那就还会报错。
上面的做法的确可以解决一些问题,但是弊端很大,每个方法都要获得控制类传过来的控制器,我的界面如下,我现在只给建立连接和断开连接两个按钮对于的事件处理添加了控制器,如果我是先点击建立连接或者断开连接,那么我的处理类就已经获得了控制器,后面点击其他按钮也没有问题,但是我一开始点击添加用户或者发送按钮的话,那么问题又来了,这里面都涉及到页面修改,但是又没有获得控制器,所以报错。当然可以在每个事件处理方法前面都将控制器传过去,但是显然不符合程序编写要求。
所以最好的方法就是一开始就将控制器传给需要调用修改页面方法的类。
如上图,真正修改页面的代码还是在控制类中,但是我的其他类需要调用该类方法实现界面更改,我不能直接访问控制类,所以需要创建一个中间类ClientUIUpdate,其他类调用 该类方法,而这个类里面方法的实现还是调用控制类,但是因为它有控制器,所以可以直接访问控制类关于界面修改的方法。
那它是怎么获取控制器的?这就是关键!看上面的ClientUI类,他是界面的启动器,需要在该类里面把控制器传给ClientUIUpdate。
在加载器加载完之后,获取控制器,并把它传给需要的类,注意后面的注释:获取控制器,必须在fxmlLoader.load()之后,如果没有.load()是不行的,获取不了控制器。