赞
踩
- public void start(Stage stage) throws Exception {
- primaryStage = stage;
- Scene loginScene;
- FXMLLoader loginFxml = new FXMLLoader(mainContrller.class.getResource("/resource/fxml/loginmenu.fxml"));
- loginScene = new Scene(loginFxml.load());
- primaryStage.initStyle(StageStyle.TRANSPARENT);
- primaryStage.getIcons().add(new Image("resource/img/icon.png"));
-
- primaryStage.setScene(loginScene); //这里会执行initialize方法,
- //加载布局类并且加载点击事件
- //在这里进行方法的执行,(这里对controller私有的stage进行赋值,
- //然后对他进行事件操作,之间绑定事件,但是不执行)
- ((loginController)loginFxml.getController()).setStage(primaryStage);
- primaryStage.show();
-
- }
在这个代码中,在JavaFX中,FXMLLoader
是用来加载FXML文件并将其转换为Java对象(例如控制器类)的工具。在这时,就已经创建了一个实例对象对应的Controller。
当您使用FXMLLoader
加载FXML文件时,它会异步地执行以下步骤:
FXMLLoader
会从指定的URL加载FXML文件。注意:这时候你如果要想自己进行初始化一些字体,类型,等等... 可以写在Controller类中的initialize方法中(这个名字不能变),因为在加载这个文件时会指向这个方法
(如果在进行场景更换的时候,在这个方法中不能写对这个scene的操作,因为这个scene还是原来stage调用的scene,后面又进行场景,相当于没有操作)
在整个过程中,FXMLLoader
是使用JavaFX的后台线程(也称为JavaFX线程)来执行这些操作的,这是为了保持UI线程的响应性。这意味着在用户界面(UI)线程中,您不会看到任何阻塞,即使FXMLLoader
正在执行耗时的操作。
当FXMLLoader
完成加载并调用load()
方法时,它会返回一个Parent
对象,这是FXML文件中定义的根节点的JavaFX表示。您可以将这个Parent
对象添加到场景中,然后设置场景到舞台上。
当primaryStage.setScene(loginScene);
被执行时,FXMLLoader
的load()
方法已经完成,并且loginScene
已经被创建。此时,loginScene
中的布局类(控制器类)已经被加载,并且与FXML文件中的控件绑定的事件处理方法也已经设置好了。
后面添加代码时,就可以安全地执行与控制器类相关的操作,因为控制器类已经加载并准备好使用。例如,您可以调用控制器类的方法,设置舞台属性等。
FXMLLoader
的load()
方法是在后台线程中执行的,以确保UI线程的响应性。当load()
方法完成后,您可以在主线程中安全地使用控制器类和FXML文件中的控件。
这其中最大的坑就是要意识到initialize这个方法是要进行初始化的,不要在这个方法中直接对controller的成员直接进行操作(除非是赋值操作,然后再进行更改操作)
- FXMLLoader loginFxml = new FXMLLoader(mainContrller.class.getResource("/resource/fxml/loginmenu.fxml"));
- loginScene = new Scene(loginFxml.load());
- //这里执行controller类中的方法
- //这个((loginController)loginFxml.getController())已经是个实例对象了
- ((loginController)loginFxml.getController()).setStage(primaryStage);
密码的可视化(这操作感觉很复杂,也不知道有没有简单方法)
首先是一个toggleButton设置一个按钮,能够判断是否点击可视化,然后在密码文本那里要设置两个文本,一个password,一个普通文本,普通文本要绑定password文本,并且要设置普通文本不可操作disable ="true";
- ToggleButton eyeButton;
- eyeButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
- @Override
- public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
- if (newValue )
- {
- System.out.println("isSelected");
- eyeButton.setText(eyeUnicode);
- passwordFiled.setVisible(true);
- passwordFiledOut.setVisible(false);
- }
- else
- {
- eyeButton.setText(uneyeUnicode);
- passwordFiled.setVisible(false);
- passwordFiledOut.setVisible(true);
- }
- }
- });
这里监听toggleButton是否点击,可以判断是否想要能够可视选项
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。