Hallo zusammen,
Ich habe eine UI mit mehreren FXML Forms in der Main Klasse injected, warum kann ich in den Controller der FXML forms nicht die Kompomenten autowiren?
Ein Beispiel der FXML Controller
BaseMetroControl ist der Controller einer allgemeinen Basisform mit einer TableView der mehrfach wiederverwendet werden kann. Die Form kann geladen werden mit dem Controller, aber der Repository ist an der Stelle null, warum?
Ich habe gemerkt, bisher war es immer so dass ich den Controller direkt in der FXML definiert habe. Kann ich das nicht programmatisch vor dem Laden der FXML machen wie in dem jetzigen Code?
Grüße
lam
Ich habe eine UI mit mehreren FXML Forms in der Main Klasse injected, warum kann ich in den Controller der FXML forms nicht die Kompomenten autowiren?
Code:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
public class MetroLogApp extends Application {
private ConfigurableApplicationContext springContext;
private Region root;
private MetroControlLog metroControl = new MetroControlLog();
@Override
public void init() throws Exception {
springContext = SpringApplication.run(MetroLogApp.class);
root = loadFxml(MetroConstants.FXML_METRO_CONTROL, metroControl);
}
private Region loadFxml(String fxml, Object controller) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fxml));
fxmlLoader.setController(controller);
fxmlLoader.setControllerFactory(springContext::getBean);
return fxmlLoader.load();
}
@Override
public void stop() throws Exception {
springContext.stop();
springContext.close();
}
@Bean
public HostServices getHostService() {
return getHostServices();
}
public static void main(String[] args) {
// Used for avoiding screenshot robot exception
System.setProperty("java.awt.headless", "false");
launch(MetroLogApp.class);
}
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Log Application");
Scene scene = new Scene(root, 1400, 820);
Region tableFormLog = loadFxml(MetroConstants.FXML_METRO_TABLE_FORM, new MetroTableFormLog());
metroControl.addNavigationItem("Log Management", tableFormLog);
metroControl.addNavigationItem("LogHistory", loadFxml(MetroConstants.FXML_METRO_TABLE_FORM, new MetroTableFormLogHistory()));
metroControl.addNavigationItem("About", new AboutController());
scene.setFill(Color.TRANSPARENT);
stage.initStyle(StageStyle.DECORATED);
stage.setScene(scene);
stage.show();
}
}
Ein Beispiel der FXML Controller
Code:
@Controller
public class MetroControlLog extends BaseMetroControl {
@Autowired LogRepository logRepository;
@Override
protected void postInitialize() {
System.out.println(logRepository);
}
}
BaseMetroControl ist der Controller einer allgemeinen Basisform mit einer TableView der mehrfach wiederverwendet werden kann. Die Form kann geladen werden mit dem Controller, aber der Repository ist an der Stelle null, warum?
Ich habe gemerkt, bisher war es immer so dass ich den Controller direkt in der FXML definiert habe. Kann ich das nicht programmatisch vor dem Laden der FXML machen wie in dem jetzigen Code?
Grüße
lam
Zuletzt bearbeitet: