在许多示例中,展示了如何扩展Application
方法以使JavaFX应用程序编写并运行。
但是,如果我不想要怎么办?如果我想从我的代码动态配置应用程序怎么办?示例如下:
import javafx.application.Application;
import javafx.stage.Stage;
public class HollowTry {
public static class HollowApplication extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
}
}
public static void main(String[] args) {
Application.launch(HollowApplication.class, args);
// now I want to set title, scene etc... how?
}
}
请不要就我为什么需要它提出异议。
更新
好的,launch()
永远不会被终止,我没有检查过。无论如何,我需要有一种方法以编程方式构建应用程序,而无需任何硬编码。
更新2
我希望从Spring构建应用程序,我现在找到了以下解决方案。
JavaFX包装类
它将上下文初始化包装到FX线程中,并捕获可从start()
访问的配置类:
public class SpringJavaFX extends Application {
private static Class<?>[] annotatedClasses;
@Override
public void start(Stage primaryStage) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(annotatedClasses);
String title = (String) context.getBean("primaryStageTitle");
primaryStage.setTitle(title);
Scene scene = (Scene) context.getBean("primaryStageScene");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void launch(Class<?>... annotatedClasses) {
SpringJavaFX.annotatedClasses = annotatedClasses;
Application.launch();
}
}
春天建设
这是一个春天建设的例子。每个组件都是一个bean并在适当的位置创建:
public class Attempt01_HelloWorld {
@Configuration
public static class Config {
@Bean
String primaryStageTitle() {
return "Attempt01_HelloWorld";
}
@Bean
Scene primaryStageScene() {
Scene ans = new Scene(root(), 800, 600);
return ans;
}
@Bean
Button button() {
Button ans = new Button();
ans.setText("Say 'Hello World'");
ans.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
root().getChildren().add(ans);
return ans;
}
@Bean
StackPane root() {
StackPane root = new StackPane();
return root;
}
}
public static void main(String[] args) {
SpringJavaFX.launch(Config.class);
}
}
答案 0 :(得分:0)
我不确定它是否可行,但您可以尝试在内部类中为应用程序的参数添加setter方法,并尝试从外部(例如从您的主要部分)调用它们。再说一遍,我不知道这是否有效,但我会试着替你试试。