我正在创建一个 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/