当前位置: 首页 > 知识库问答 >
问题:

映射后加载fxml时出现javafx应用程序异常的spring

仲孙俊贤
2023-03-14

main.java

@ComponentScan("test.spring.boot")
@SpringBootApplication
public class Main extends Application {

    protected ConfigurableApplicationContext springContext;
    protected StageManager stageManager;

    @Override
    public void start(Stage primaryStage) throws IOException {
        stageManager = springContext.getBean(StageManager.class, primaryStage);
        displayInitialScene();
    }

    @Override
    public void init() throws Exception
    {
        springContext=springBootApplicationContext();
    }


    protected void displayInitialScene() {
        stageManager.switchScene(FxmlView.LOGIN);
    }


     @Override
     public void stop() throws Exception {
        springContext.close();
     }

    private ConfigurableApplicationContext springBootApplicationContext() {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(Main.class);
        String[] args = getParameters().getRaw().stream().toArray(String[]::new);
        return builder.run(args);
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

controller.java

public class LoginPageController implements Initializable{

    @FXML
    private TextField txtUserName;

    @FXML
    private PasswordField txtPassward;

    @FXML
    private Button btnLogin;

    @FXML
    private Label lblLogin; 

    @Autowired
    private UserService userService;

    @Lazy
    @Autowired
    private StageManager stageManager;

    @FXML
    public void login()
    {
        if(userService.authenticate(txtUserName.getText(), txtPassward.getText()))
        {
            stageManager.switchScene(FxmlView.USER);
        }
        else
        {
            lblLogin.setText("Login Failed.");
        }
    }


    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }
}

FXMLView.java

public enum FxmlView {
    USER {
        @Override
        public String getTitle() {
            return getStringFromResourceBundle("user.title");
        }

        @Override
        public String getFxmlFile() {
            return "/test/spring/boot/TestSpring.fxml";
        }
    }, 


    LOGIN {
        @Override
        public String getTitle() {
            return getStringFromResourceBundle("login.title");
        }

        @Override
        public String getFxmlFile() {
            return "/test/spring/boot/LoginPage.fxml";
        }
    };

    public abstract String getTitle();
    public abstract String getFxmlFile();

    String getStringFromResourceBundle(String key){
        return ResourceBundle.getBundle("Bundle").getString(key);
    }
}
@Component
public class SpringFXMLLoader {
    private final ResourceBundle resourceBundle;
    private final ApplicationContext context;

    @Autowired
    public SpringFXMLLoader(ApplicationContext context, ResourceBundle resourceBundle) {
        this.resourceBundle = resourceBundle;
        this.context = context;
    }

    public Parent load(String fxmlPath) throws IOException {      
        FXMLLoader loader = new FXMLLoader();
        loader.setControllerFactory(context::getBean); //Spring now FXML Controller Factory
        loader.setResources(resourceBundle);
        loader.setLocation(getClass().getResource(fxmlPath));
        System.out.println("springfxmlloader class : "+fxmlPath);
        System.out.println("LOADER : ");
        return loader.load();
    }
}
public class StageManager {

 private static final Logger LOG = getLogger(StageManager.class);
    private final Stage primaryStage;
    private final SpringFXMLLoader springFXMLLoader;

    public StageManager(SpringFXMLLoader springFXMLLoader, Stage stage) {

    System.out.println(">>>>>>>>>>>>>>>>>> 1");

        this.springFXMLLoader = springFXMLLoader;
        this.primaryStage = stage;
    }

    public void switchScene(final FxmlView view) {
        System.out.println(">>>>>>>>>>>>>>>>>> 2");
        Parent viewRootNodeHierarchy = loadViewNodeHierarchy(view.getFxmlFile());
        show(viewRootNodeHierarchy, view.getTitle());
    }

    private void show(final Parent rootnode, String title) {
        Scene scene = prepareScene(rootnode);
        //scene.getStylesheets().add("/styles/Styles.css");

        //primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setTitle(title);
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.centerOnScreen();

        System.out.println(">>>>>>>>>>>>>>>>>> 3");

        try {
            primaryStage.show();
        } catch (Exception exception) {
            logAndExit ("Unable to show scene for title" + title,  exception);
        }
    }

    private Scene prepareScene(Parent rootnode){

        System.out.println(">>>>>>>>>>>>>>>>>> 4");
        Scene scene = primaryStage.getScene();

        System.out.println("SCN >>>>>>>>>>>>>>>>>>>> : "+ scene);

        if (scene == null) {
            scene = new Scene(rootnode);
        }
        scene.setRoot(rootnode);
        return scene;
    }


    private Parent loadViewNodeHierarchy(String fxmlFilePath) {

        System.out.println(">>>>>>>>>>>>>>>>>> 5 path: "+fxmlFilePath);
        Parent rootNode = null;
        try {
            System.out.println(fxmlFilePath);
            rootNode = springFXMLLoader.load(fxmlFilePath);
            System.out.println(">>>>5 : try");
            Objects.requireNonNull(rootNode, "A Root FXML node must not be null");
        } catch (Exception exception) {

            System.out.println("File path????? : "+fxmlFilePath);

            logAndExit("Unable to load FXML view >> " + fxmlFilePath, exception);
            exception.printStackTrace();
        }

        return rootNode;
    }


    private void logAndExit(String errorMsg, Exception exception) {

        System.out.println(">>>>>>>>>>>>>>>>>> 6");
        LOG.error(errorMsg, exception, exception.getCause());
        Platform.exit();
    }
}

共有1个答案

施阳曜
2023-03-14

您忘记在LoginPageController类上添加一个原型,这就是Spring告诉您的原因:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'test.spring.boot.LoginPageController'

由于类没有标记,component-scan将忽略它,并且将没有可为该类型分配的bean寄存器。

尝试:

@Controller
public class LoginPageController implements Initializable{

    @Autowired
    public LoginPageController(UserService userService, private StageManager stageManager){
        this.userService = userService;
        this.stageManager = stageManager;
    }
}
 类似资料:
  • 我一直在做一个桌面应用程序,在那里我需要使用JavaFX。我在使用Scene Builder构建的eclipse上的JavaFX项目中创建了各种FXML文件。除了这个讨厌的文件(fxmlimglist.FXML)外,我加载任何FXML文件都没有问题。 其主要思想是,当按下一个按钮时,会出现一个新窗口。下面是该按钮的事件处理程序的代码: package explorer中的项目如下所示: https

  • 我是网络服务和玻璃鱼的新手。这是我的代码 如果我有 当我尝试部署web服务时,我得到以下错误。 无法部署TestGF部署失败=部署期间发生错误:加载应用程序时出现异常:java.lang.IllegalStateException:ContainerBase。addChild:开始:org.apache.catalina。LifecycleException:java.lang.RuntimeEx

  • 严重:加载应用程序信息时出现异常:file:/c:/users/administrateur/documents/netbeansprojects/gparc_v1.0/gparc-ear/target/gfdeploy/gparc-ear/gparc-ejb-1.0_jar/_gparc-ejbpu注销成功信息:[7]已删除ID为98894641828724736的计时器 严重:加载应用程序时出

  • 问题内容: 我遇到了一个我绝对无法独自解决的问题,因为我刚刚开始使用JAVA FX。我得到了一个讨厌的javafx.fxml.LoadException:,但是我的操作完全像一个指南,但是我无法运行Main。这是异常输出: LoginController.java LoginGUI.fxml 和Main.java 问题答案: 问题出在源头 因此,您必须将其更改为适当的 这样做,在这里编辑fxml文

  • 问题内容: 我正在尝试加载FXML文件并将其显示为应用程序窗口,但出现异常。FXML文件是由FXML Scene Builder创建的。 这是班级的代码 和FXML文件 这是我得到的例外 我究竟做错了什么? 问题答案: 如果无法在运行时类路径(而不是当前目录等)上找到资源,则简短答案是静默返回。 因此,这取决于你的IDE项目设置,如果你使用的是eclipse,请尝试添加运行配置中的文件夹。 一些想

  • testFX。java: testFXController.java: 测验fxml: 当我运行testFX. java时,系统打印: 这是教授的代码,我似乎无法运行它。我意识到主要问题在代码