JavaFX初始化TextField的数组

问题描述:

我想在JavaFX中创建TextField的数组,但出现错误。 我有10个TextFields:path1,path2 ... path10。JavaFX初始化TextField的数组

//initialization 
@FXML 
private TextField path1,path2,path3,path4,path5,path6,path7,path8,path9,path10; 
@FXML 
private TextField[] paths = {path1,path2,path3,path4,path5,path6,path7,path8,path9,path10}; 

然而,当我写

String text = paths[0].getText(); 
paths[1].setText(name); 

这第一行让我NullPointerException异常。

我找到的解决方案是使用我Сontroller的Initizlizatior,但这是这么丑:

public void initialize(URL fxmlFileColation, ResourceBundle resources) { 
    paths[0] = path1; 
    paths[1] = path2; 
    paths[2] = path3; 
    paths[3] = path4; 
    paths[4] = path5; 
    paths[5] = path6; 
    paths[6] = path7; 
    paths[7] = path8; 
    paths[8] = path9; 
    paths[9] = path10; 
} 

我怎样才能在众多行摆脱手动assinment的,使

@FXML 
private TextField[] paths = {path1,path2,path3,path4,path5,path6,path7,path8,path9,path10}; 

工作?

+0

的[创建JavaFX中使用FXML标签阵列(可能的复制http://*.com/questions/28587297/create-array-of-label-using -fxml-in-javafx) – DVarga

你不能使这个确切的代码工作。创建阵列

private TextField[] paths = {path1,path2,path3,path4,path5,path6,path7,path8,path9,path10}; 

发生在初始化器中。然而,fxml文件的加载过程如下所示:

  1. 创建控制器类实例(或使用现有的实例)。
  2. 加载fxml内容注入由加载器创建的对象。
  3. 控制器上调用initialize,如果存在。

而在步骤以后创建要在阵列中存储的对象上面的代码在步骤1执行2

您可以解决此通过使用FXML创建的一个ListTextField S和其注入到所述控制器(see my answer to Grouping together JavaFX FXML Objects

当然也可以创建包含在initialize方法使用数组初始化的特定元素TextField个数组:

public void initialize() { 
    paths = new TextField[] {path1,path2,path3,path4,path5,path6,path7,path8,path9,path10}; 
} 
+0

谢谢你的详细解答!但是我无法理解你答案的第一部分。只是让它在Void Initialise()中工作。你能否建议阅读理解这一点? – Vittori0

+0

@ Vittori0:我在链接的答案中描述了方法。它只是将'Node'插入到场景图和列表中。请参阅[* FXML *简介](https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html),“定义块”/ fx:参考。如果您正在引用加载过程的描述,请阅读该页面上的控制器部分;在创建对象期间初始化的字段,这在'FXMLLoader'稍后通过注入字段使用控制器实例之前发生,这是当'path'字段变为非''null'时。 – f*

我不认为你可以。您需要分别声明变量,以便FXML可以初始化变量。然后,你需要通过设置每个元素来使你的TextField阵列工作。做这件事的最好方法是使用你在initialize(...)函数中的解决方案,并将其用于它的意义上 - 初始化事物。

一个简单的解决方案,我使用

TextField[] txt = new TextField[beanFields.length]; 
for (int i=0; i<=beanFields.length-1; i++) { 
       TextField textField = new TextField(); 
       txt[i] = textField; 
       textField.setPrefWidth(200); 
       textField.setPrefHeight(32); 
    }