- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
环境:使用场景生成器的 Java FX 8
上下文:我试图使用 ObservableList
创建一个包含 TableView
和 TableColumn
的简单阶段。调用create_ConfigStage()
来创建阶段,并初始化initialize()
。 FXML 的 Controller 类是 ControllerA
(就是这个类),一切都很顺利,直到..
问题:无法弄清楚为什么在 create_ConfigStage()
中调用 words.size
会导致 NullPointerException(或 0),但在 initialize() 中调用相同的内容
没有问题。
问题类型:java.lang.NullPointerException
,或者准确地说,在initialized()
中初始化的值在阶段创建(或类似的东西)后未初始化。
仅供引用:没有其他东西会干扰 words
变量甚至 templates
变量。
附加测试:
刚刚添加了按钮来使用 button
和 handleButton
测试单词的大小。结果又OK了。但空指针仍然在同一个老地方。
刚刚添加了一个字符串 testVal
以查看值是否发生变化。显然,事实并非如此。
class ControllerA {
@FXML TableView<Words> templatesTable;
@FXML TableColumn<Words, String> templateHeaders;
@FXML Button button;
Stage stage;
ObservableList<Words> templates;
List<Words> words = new ArrayList<Words>();
String testVal = "Nothing Happened";
@FXML
public void initialize(){
words = FileUtil.readMacroFile(new File("macros.dat"));
templates = FXCollections.observableArrayList();
templates.addAll(words);
templatesTable.setItems(templates);
templateHeaders.setCellValueFactory(new PropertyValueFactory<Words, String>("header"));
testVal = "Something Happened";
System.out.println(words.size()); //<<-- size = 5 (THIS IS PRINTED)
}
public void create_ConfigStage() {
stage = new Stage();
FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemResource("windows/configureTemplates.fxml"));
AnchorPane root = null;
try {
root = loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(testVal); //This one prints "Nothing Happened" instead of "Something happened"!!!
System.out.println(words.size()); //<<-- The line showing null pointer(if wasnt initialized in initializer() else shows 0)
}
@FXML
public void handleButton(){
System.out.println(words.size()); // <<-- this one prints 5(THIS IS PRINTED AS WELL)
}
调用create_ConfigStage()的代码
public class Main_Controller {
@FXML Button createConfig;
@FXML
public void handleConfigTemplateRequest(){
main.getControllerA().create_ConfigStage();
//This method is invoked by "createConfig" button
}
}
这是调用创建主阶段的类
public class Main extends Application{
public void start(Stage mainStage) throws Exception{
this.primaryStage = mainStage;
mainStage.setTitle("Scratch GLSL Editor");
FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemResource("main.fxml")); //main.fxml's controller is class Main_Controller
AnchorPane root = loader.load();
Scene mainScene = new Scene(root);
mainStage.setScene(mainScene);
mainStage.show();
ControllerA controllerA = new ControllerA();
controllerA.setMain(this); //to get the controller from this class
setControllerA(controllerA);
}
//setter and getter for ControllerA here
public static void main(String[] args){
launch(args);
}
}
最佳答案
ControllerA
的实例您调用create_ConfigStage()
由该行创建
ControllerA controllerA = new ControllerA();
换句话说,它不是作为 load(...)
的一部分为您创建的。 FXMLLoader
的过程。因此,任何 FXML
-注入(inject)的字段未初始化,并且 initialize()
永远不会在该实例上调用方法。
稍后,当您加载 FXML 时,FXMLLoader
创建 ControllerA
的另一个实例,并作为 load(...)
的一部分进程调用initialize()
在那个实例上。当按下按钮时,将在同一个 FXMLLoader
上调用事件处理程序方法。 -创建的实例。
因此,words
已从您的 FileUtil.readMacroFile(...)
正确初始化FXMLLoader
中的方法- 创建的实例,但从未在您自己创建的实例中正确初始化。因此,对于您调用 create_ConfigStage()
的实例, words
是空的ArrayList
您在声明中创建内联(或 null
,如果您在声明中省略 = new ArrayList<Words>()
)。
您想要做什么还不是很清楚,因为您没有真正显示 FXML 文件和各种 Controller 之间的关系,而是获取由 FXMLLoader
加载的 Controller 实例。你会使用类似的代码
FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemResource("windows/configureTemplates.fxml"));
AnchorPane root = null;
try {
root = loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.showAndWait();
ControllerA controllerA = loader.getController();
System.out.println(controllerA.getWords().size());
} catch (IOException e) {
e.printStackTrace();
}
有合适的getWords()
ControllerA
中定义的方法:
public List<Words> getWords() {
return words ;
}
显然你不能在 ControllerA
的实例方法中执行此操作,因为您创建了先有鸡还是先有蛋的情况(您需要从 FXMLLoader
获取 Controller 实例,但在获得 Controller 实例之前不要调用 FXMLLoader
)。
您在这里遇到问题的原因是您试图反转通常的 FXML 加载过程。通常的流程是这样的:
FXMLLoader
load(...)
关于FXMLLoader
FXMLLoader
读取 FXML 文件FXMLLoader
创建 Controller ,如 fx:controller
指定的那样FXML 文件中的属性换句话说,FXML 文件( View )为您实例化 Controller 。
您正在尝试以相反的方式做事,即您正在尝试让 Controller 实例创建 FXMLLoader
然后加载 View 。您可以让事情以这种方式进行,但您必须以不同的方式进行设置。以下假设您没有在其他任何地方加载此 FXML 文件(您至少必须相应地修改该代码)。
首先,删除 fx:controller
来自 configureTemplates.fxml
的属性 (因为您要在创建 FXMLLoader
之前创建 Controller ,所以您不希望加载程序再实例化 Controller 类)。
然后修改你的create_ConfigStage()
方法如下:
public void create_ConfigStage() {
stage = new Stage();
FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemResource("windows/configureTemplates.fxml"));
// Tell the FXMLLoader to use this object as the controller.
// Note that if the fxml file has a fx:controller attribute,
// loading it will fail with an IllegalStateException:
loader.setController(this);
AnchorPane root = null;
try {
// Since we set this object as the controller, loading will
// initialize all the @FXML fields defined in this instance, and will
// invoke initialize() on this instance:
root = loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(testVal); // This should show the value updated in initialize()
System.out.println(words.size()); // This should give the number loaded by FileUtil.readMacroFile(...)
}
您可能还想阅读 this related technique .
关于JavaFX。尝试在 Controller 内实例化阶段不会检索其中的值?是吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32075725/
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!