前言:本次结合springboot,采用的是FXML的方式,打包工具gradle
一:准备
在maven中央仓库上面找到下面的依赖,导入build.gradle中
implementation 'de.roskenet:springboot-javafx-support:2.1.6'
二:修改Application类,测试应用
主类是需要继承AbstractJavaFxApplicationSupport这个类型,添加main方法和SpringBootApplication注解。我们使用launch方法代替SpringApplication.run
launch方法在AbstractJavaFxApplicationSupport有多个重载
/**
* appClass 应用启动类
* view 视图,启动界面
* splashScreen 应用启动时闪屏
* args command 参数
*/
launch(final Class<? extends Application> appClass,final Class<? extends AbstractFxmlView> view, final String[] args);
launch(final Class<? extends Application> appClass,final Class<? extends AbstractFxmlView> view, final SplashScreen splashScreen, final String[] args)
注意:上面改造启动类中,使用的是
launch(Class<? extends Application> appClass, String... args)
为了测试工程是否搭建成功,所以先使用的Application的launch方法,因为AbstractJavaFxApplicationSupport继承Application,所以可以直接使用
接下来我们先创建一个场景测试一下
@Override
public void start(Stage stage) throws Exception {
/**
* 首先我们创建一个Button,当我们点击Button的时候,改变Button的内容。
*/
Button btnHello = new Button("Hello");
/**
* 设置btnHello按钮点击事件
* 这里使用了Java8的Lambda表达式。setOnAction的参数为EventHandler<ActionEvent> value
* EventHandler为一个接口,所以我们有三种方式实现EventHandler接口:
* 1. 创建一个内部类
* 2. 创建一个匿名类
* 3. 使用Lambda表达式(适用于函数体不大的情况)
*/
btnHello.setOnAction(event->{
btnHello.setText("Hello World, I am JavaFX!");
});
/**
* BorderPane是一个用于布局的Pane,BoerderPane将面板分割为上下左右中五部分。
* 我们可以将UI控件放置在BorderPane的上下左右和中间。
* 这里将将Button放置在中间。
*/
BorderPane pane = new BorderPane();
pane.setCenter(btnHello);
// 将pane加入到Scen中
Scene scene = new Scene(pane, 500, 500);
// 设置stage的scen,然后显示我们的stage
stage.setScene(scene);
stage.setTitle("Hello World");
stage.show();
}
效果:
到这里,表示我们在springboot启动应用成功了,但是目前和springboot-javafx-support还没有关系。
三:改造应用
-
创建一个fxml文件
fx:controller表示一个fxml处理器,这里(非常类型android studio开发),注意这里需要添加全路径class名。可以将FXML文件中声明的GUI组件绑定在一起。加载FXML文件时,将创建此类的实例。为此,控制器类必须具有无参数构造函数。
fx:id:FXML元素分配ID。这些ID可用于引用FXML文件中其他位置的FXML元素。通过id,FXML命名空间中的属性指定FXML元素的ID,可以将FXML文件中的JavaFX组件绑定到控制器类中的字段 -
创建controller
创建一个loginController绑定login.xml,实现Initializable接口初始化组件状态@FXMLController public class LoginController implements Initializable { private Stage primaryStage; @FXML // 可忽略 public Button button;// 注意必须为public修饰符 @Override public void initialize(URL location, ResourceBundle resources) { primaryStage = JavafxSpringboot1Application.getStage(); button.setOnAction(event -> { Alert alert = new Alert(Alert.AlertType.INFORMATION, "hello world"); alert.initOwner(primaryStage); alert.showAndWait(); }); } }
@FXMLController是springboot-javafx-support的注解
表明这是一个FXML处理器,它会给控制器添加一个@Component的注解,将类交给spring容器管理。 -
创建view
@FXMLView(value = "/fxml/login.fxml" ) public class LoginView extends AbstractFxmlView { }
@FXMLView是springboot-javafx-support的注解
表示要在JavaFX视图的上下文中使用的类。这些类与fxml标记文件结合使用。它会给控制器添加一个@Component的注解,将类交给spring容器管理。
AbstractFxmlView :它通过Spring为Java FX控制器提供DI,同时支持使用注解@FXMLView来驱动,配置fxml,css等 -
改造启动类
删除重写start@SpringBootApplication public class JavafxSpringboot1Application extends AbstractJavaFxApplicationSupport { public static void main(String[] args) { launch(JavafxSpringboot1Application.class, LoginView.class, args); } }
效果: