java - 模块化 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 异常。有人可以帮我实现正确的代码吗?谢谢!
解决方案
推荐阅读
- javascript - 暂停圆形菜单的 CSS 动画以打开和关闭
- javascript - 使用唯一的“key”道具反应过滤器项目并且是空比较
- javascript - 使用 django 和 AJAX 在填充字段中提交表单后,“此字段为必填项”
- javascript - 节点 JS Dialogflow 错误:INVALID_ARGUMENT:未设置输入文本。?
- c - 来自 Ua_Variant 的 C 类型转换
- swift - 如何使用“空”谓词创建 NSCompoundPredicate
- firebase - 将 contains() 与 firebase 规则一起使用
- mysql - SQL 查询根据条件返回额外的列
- java - 将复杂的 JSON 解析为列表
- javascript - 如何确保 Web 应用程序使用具有正确 URL 的 firebase 函数模拟器进行测试