我正在创建一个JavaFX应用程序,当我为FXML文件创建一个控制器时,构造函数总是一样的。
有没有办法编写自定义注释来创建我的构造函数? 像这样:
public class MyClass() {
@InitFxml(file = "test")
public MyClass() {
}
@InitFxml会将以下代码注入构造函数:
FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml");
...
或是否可以为创建此默认构造函数的类创建注释?
非常感谢任何帮助。
答案 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);
}
}
这似乎并不比在空构造函数上定义注释重。