JavaFX Anwendung mit Spring Boot und mehrere FXML Forms

lam_tr

Top Contributor
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?

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:
Du erstellst den Controller selbst per new, das läuft also unabhängig von Spring.

Kannst den entweder selber über den springContext laden, oder das Laden ganz an JavaFX und Spring abgeben (indem du den Controller wie von dir gesagt in der FXML angibst)
 
Du erstellst den Controller selbst per new, das läuft also unabhängig von Spring.

Kannst den entweder selber über den springContext laden, oder das Laden ganz an JavaFX und Spring abgeben (indem du den Controller wie von dir gesagt in der FXML angibst)
Über SpringContext laden bedeutet

Code:
context.getBean(MetroCotnrol.class)

oder?
 

Neue Themen


Zurück
Oben