【问题标题】:JavaFX initialize array of TextFieldsJavaFX 初始化 TextFields 数组
【发布时间】:2017-11-16 20:50:21
【问题描述】:

我正在尝试在 JavaFX 中创建 TextField 数组,但出现错误。 我有 10 个文本字段:path1、path2 ... path10。

//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;
}

我怎样才能摆脱多行的手动组合并制作

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

工作?

【问题讨论】:

标签: java arrays javafx initialization


【解决方案1】:

您无法使这个确切的代码工作。数组创建在

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

发生在初始化程序中。然而,fxml 文件的加载过程是这样的:

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

上面的代码在第 1 步中执行,而您要存储在数组中的对象在第 2 步中稍后创建。

您可以通过使用 fxml 创建 TextFields 的 List 并将其注入控制器 (see my answer to Grouping together JavaFX FXML Objects) 来解决此问题

当然,您也可以使用initialize 方法中的数组初始值设定项创建包含特定元素的TextFields 数组:

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

【讨论】:

  • 感谢您的详细解答!但是我无法理解您答案的第一部分。刚刚让它在 Void Initialise() 中工作。您能否建议阅读以了解这一点?
  • @Vittori0:我在我链接的答案中描述了这种方法。它只是将Nodes 插入到场景图和列表中。请参阅Introduction to FXML,“定义块”/fx:reference 部分。如果您指的是加载过程的描述,请阅读该页面上的控制器部分;在创建对象期间初始化的字段,这发生在 FXMLLoader 稍后通过注入字段使用控制器实例之前,这是当path 字段变为非null
【解决方案2】:

我不认为你可以。您需要单独声明变量,以便 FXML 可以初始化变量。然后,您需要通过将每个元素设置为某个值来使您的 TextField 数组正常工作。最好的方法是使用 initialize(...) 函数中的解决方案,并将其用于它的目的——初始化。

【讨论】:

    【解决方案3】:

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

     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);
        }
    

    【讨论】:

    • 这里的beanFields是什么?
    猜你喜欢
    • 2022-01-22
    • 2018-11-24
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多