如何在没有引用的情况下设置新创建的TextField的大小

时间:2017-06-05 07:20:46

标签: javafx

我使用new TextField创建文本字段的代码被用作此类方法的参数

x.getChildren.addAll(new TextField());

我的程序有一个创建TextField的按钮。

在满足条件之前,它是一个创建数字TextFields的循环    我自己的代码如下:

sub.setOnAction(e-> {
    v.getChildren().clear(); //just clearing things
    v1.getChildren().clear(); //just clearing things

    makeStr(Integer.valueOf(numOpt.getText()));
    for(int i = 0; i < list.size(); i++){
        v.getChildren().addAll(new Label(list.get(i).toString()));
        v1.getChildren().addAll(new TextField());           
    }   
    list.clear();
});

但是我不能像这样改变它的大小。

v1.getChildren().addAll(new TextField().setPrefWidth(800));

也许更好的代码可以解决问题!

2 个答案:

答案 0 :(得分:1)

创建对您实例化的每个TextField的引用,设置大小,然后将其添加到视图中。不要使用ObservableList#addAll方法,因为您只添加一个组件。调用标准ObservableList#add方法。

for (int i = 0; i < list.size(); i++) {
    v.getChildren().add(new Label(list.get(i).toString()));
    TextField tf = new TextField();
    tf.setPrefWidth(800);
    v1.getChildren().add(tf);
}

答案 1 :(得分:1)

只要您只需要在一个或两个位置执行此操作,您就不会通过编写一些允许您在单个表达式中执行此操作的代码来获得更多收益。在这种情况下,只需使用局部变量来存储字段就是最好的方法。

for(Object element : list){
    v.getChildren().add(new Label(element.toString()));

    TextField textField = new TextField();
    textField.setPrefWidth(800);
    v1.getChildren().add(textField);
}

使用方法创建&amp;初始化字段

如果您需要在代码中的多个位置创建TextField并同时初始化prefWidth属性,则创建返回初始化字段的方法将非常有用。

public static TextField createTextField(double prefWidth) {
    TextField textField = new TextField();
    textField.setPrefWidth(prefWidth);
    return textField;
}

允许你写

v1.getChildren().add(createTextField(800));

而不是

TextField textField = new TextField();
textField.setPrefWidth(800);
v1.getChildren().add(textField);

为了在初始化时更加灵活,您还可以为TextField创建构建器。

使用CSS样式表

CSS允许您一次设置多个节点的属性。您只需要一种方法来识别要应用规则的正确节点。在这种情况下,规则将应用于v1的所有子项,因此通过向此节点添加样式类,您可以识别目标节点:

<强>的java

// after creating v1/the scene
v1.getStyleClass().add("v1");
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
for(int i = 0; i < list.size(); i++){
    v.getChildren().addAll(new Label(list.get(i).toString()));
    v1.getChildren().addAll(new TextField());
}

<强>的style.css

v1>* {
    -fx-pref-width: 800;
}