首页 > 解决方案 > 模块化 FXML 控制器 JavaFX 上的 hostServices

问题描述

我正在尝试使用上个月开始学习的 JavaFX 构建应用程序。我想用多个 FXML 文件及其控制器制作一个模块化 GUI。这是我的主要内容:

package package;

import controllers.homeController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        FXMLLoader loader = new FXMLLoader(getClass().getResource("../resources/rchmain.fxml"));
        Parent root = loader.load();

        homeController homeController = loader.getController();
        homeController.setGetHostController(getHostServices());

        FXMLLoader loaderLink = new FXMLLoader(getClass().getResource("../resources/links.fxml"));
        loaderLinks.load();

        linksController linksController = loaderLink.getController();
        linksController.setGetHostController(getHostServices());

        primaryStage.setTitle("title");

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        scene.getStylesheets().add((getClass().getResource("../resources/stylesheet.css")).toExternalForm());
        primaryStage.show();


    }


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

这是我的主控制器,它非常空,因为我目前正在处理 GUI 的另一部分:

package controllers;

import javafx.application.HostServices;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;

public class homeController implements Initializable {

    HostServices hostServices;

    public void setGetHostController(HostServices hostServices) {
        this.hostServices = hostServices;
    }



    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {


    }

}

我正在尝试模块化控制器和 FMXL,目前正在处理将被单击以打开用户的 Facebook、Instagram 等的链接。这将是 linksController:

package controllers;

import javafx.application.HostServices;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Hyperlink;
import javafx.scene.layout.VBox;
import java.net.URL;
import java.util.ResourceBundle;

public class linksController implements Initializable {

    public VBox links;
    public Hyperlink facebookLink;
    public Hyperlink instagramLink;

    HostServices hostServices;

    public void getExternalSite(String link) {
        hostServices.showDocument(link);
    }

    @FXML
    private void openFacebook(ActionEvent actionEvent) {
        getExternalSite("www.facebook.com");
    }

    @FXML
    private void openInstagram(ActionEvent actionEvent) {
        getExternalSite("www.instagram.com");
    }

    public void setGetHostController(HostServices hostServices) {
        this.hostServices = hostServices;
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {


    }

我的问题如下:我首先在一个文档中控制了主控制器中的链接和所有 FXML。我开始使用 fx:include 将各个部分模块化并创建新的控制器(我使用 fx:controller 分配给模块)。当一切都在一个 FXML/控制器中时,链接工作正常。现在我正在尝试模块化 GUI,每次单击我创建的链接时,hostServices 都会引发 nullPointer 异常。有人可以帮我实现正确的代码吗?谢谢!

标签: javajavafxcontrollerfxml

解决方案


推荐阅读