Javafx只初始化一次控制器构造函数?
Posted
技术标签:
【中文标题】Javafx只初始化一次控制器构造函数?【英文标题】:Javafx Initialize Controller Constructor only Once? 【发布时间】:2020-09-05 08:18:16 【问题描述】:我正在构建一个 Javafx gui 应用程序,我正面临这个问题。我的程序确实有多个场景,所以我有不同的 FXML 文件和控制器类。问题是在第一个“主菜单”(这是我的应用程序中弹出的第一个)场景中,在控制器的构造函数中,我调用了一些从数据库加载数据的重型方法等等。 那么这会发生什么。在接下来的场景中,我确实有“主菜单按钮”,可以切换到主菜单场景!所以每次我回到“主菜单”场景时,构造函数都会调用加载数据的繁重方法。而我不想要那个。我不想每次都调用这些方法,只是在开始时调用一次。 这是一些简化的示例代码:
主菜单场景(控制器)
public class MainController
@FXML
Button bt1 = new Button();
@FXML
Button bt2 = new Button();
@FXML
Button bt3 = new Button();
public static int choice=0;
//constructor
public MainController()
try
//heavy databse tasks here(loading data)
catch (Exception e)
//error handling
@FXML
public void initialize()
另一个控制器类
public class Scene2Controller
private Button mainMenu = new Button();
//constructor
public Scene2Controller()
@FXML
public void initialize()
public void goMainMenu(ActionEvent actionEvent) throws IOException
Parent menu= FXMLLoader.load(getClass().getResource("/mainScene.fxml"));
Stage window = (Stage) mainMenu.getScene().getWindow();
window.getScene().setRoot(menu);
window.show();
所以在第二个控制器中,我有一个侦听器方法,当单击按钮时,它会返回主菜单场景,加载适当的 FXML 文件。
我知道这对你们中的大多数人来说非常简单,但我是 javafx 的新手,我想知道我是否有做错切换场景的事情,或者我应该为我拥有的这些方法做不同的事情mainMenu 构造器类,仅运行一次。那是可获得的还是我应该创建一个在主菜单场景之前运行的子控制器类?提前致谢。
【问题讨论】:
要么:不要每次都重新加载FXML,只需保留对要显示的场景的引用并重新显示即可。或者(可能更好):将数据库加载任务移动到一个单独的类并只实例化该类一次。使用***.com/questions/14187963/… 中的技术将该类的(单个)实例传递给任何需要它的控制器 @James_D 如果我使用你的第二个选项,我应该在哪里实例化你说的那个单独的类。我的意思是我可以很容易地在 Mainclass 的 Start 方法中完成这项工作。这是一个好习惯吗? @kleopatra 我做了一些编辑,我还有什么遗漏吗? @Panagiss 主类的职责是启动应用程序;start()
或 init()
方法都是初始化在整个应用程序中使用的模型数据的好地方。对于类似的东西(但不完全相同),请参阅***.com/questions/32342864/applying-mvc-with-javafx/…
现在完美:))
【参考方案1】:
在我的例子中,我不得不调用几个方法,所以我只是将它们从第一个场景控制器类中删除,并将它们添加到我的 MainClass
的 start()
方法中,而不是在控制器类中。我认为@James_D 的回答对于像我这样的类似问题来说总体上是最好的。谢谢!
【讨论】:
以上是关于Javafx只初始化一次控制器构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
java学习之静态块显示初始化块构造函数this在构造函数中的调用,区别联系与调用顺序