JavaFX:使用注释创建的构造函数

标签 java constructor javafx

我正在创建一个 JavaFX 应用程序,当我为 FXML 文件创建 Controller 时,构造函数始终相同。

有没有办法编写自定义注释来创建我的构造函数? 像这样的事情:

public class MyClass() {

    @InitFxml(file = "test")
    public MyClass() {
    }

@InitFxml 会将以下代码注入(inject)到构造函数中:

FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml");
...

或者是否可以为创建此默认构造函数的类创建注释?

非常感谢任何帮助。

最佳答案

要处理注释,您必须定义某种处理它的容器,并始终通过该容器加载您的类,或者定义附加到编译器的注释处理器(我认为:我对此一无所知第二个选项)。

为什么不直接传递一个字符串作为参数呢?您可以定义一个接口(interface):

import java.net.URL;

import javafx.fxml.FXMLLoader;


public interface CustomComponent {
    public default void loadFXML(String fxml) {
        try {
            URL resource = getClass().getResource(fxml);
            FXMLLoader loader = new FXMLLoader(resource);
            loader.setRoot(this);
            loader.setController(this);
            loader.load();
        } catch (Exception exc) {
            if (! (exc instanceof RuntimeException)) {
                throw new RuntimeException(exc);
            } else {
                throw (RuntimeException)exc ;
            }
        }
    }
}

然后让您的自定义组件实现它,从构造函数调用该方法:

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class CustomComponentTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new CustomVBox(), 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static class CustomVBox extends VBox implements CustomComponent {

        @FXML
        private Label label ;

        public CustomVBox() {
            loadFXML("CustomVBox.fxml");
        }

        @FXML
        private void click() {
            System.out.println("Click!");
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这似乎并不比在空构造函数上定义注释更重。

关于JavaFX:使用注释创建的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31480587/

相关文章:

java - Oozie Hive 日志丢失

java - 欺骗 Java Web Start 关于操作系统

java - 我似乎不知道如何处理这个实例,以便我的代码可以打印出要求

java - 有没有办法修复这个无效的模块名称错误?

java - 带有重复bean和@Order注释的Spring依赖注入(inject)

java - OpenCV Java.多个图像并排

c++ - ctor 声明/定义中接受的 const 限定符(llvm 错误?)

c++ - 如何使用构造函数初始化另一个类中的对象?

java - 使用 Java FX 在服务器端生成图像

java - 如何在Javafx中设置条形图的颜色