JavaFX:使用注释

时间:2015-07-17 16:33:50

标签: java constructor javafx

我正在创建一个JavaFX应用程序,当我为FXML文件创建一个控制器时,构造函数总是一样的。

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

public class MyClass() {

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

@InitFxml会将以下代码注入构造函数:

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

为什么不将字符串作为参数传递。您可以定义一个界面:

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);
    }
}

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