在javaFX TextField中设置文本颜色“不使用CSS”

时间:2018-11-04 18:55:19

标签: java javafx textfield

如果您打算建议CSS,那么请不要打扰,我知道它可以正常工作并且易于使用,这只是出于好奇,因为我讨厌在Java编码时处理CSS。

JavaFX TextField不直接扩展Parent,它具有一个Node类型的子节点的“不可修改的” ObservableList,并且其中之一必须是Text类型,因此我扩展了TextField类并编写了两种方法进行检查,该方法获得TextField中所有的子项。

n - 1 /* Integer decrement  */
2**n + s /* One bit-shift and one integer addition  */

这是要打印出结果。

public ArrayList<Node> getAllChildren(Parent parent) {
    ArrayList<Node> res = new ArrayList<Node>();
    for (Node n : parent.getChildrenUnmodifiable()) {
        if (n instanceof Parent) {
            res.addAll(getAllChildren((Parent) n));
        } else {
            res.add(n);
        }
    }
    return res;
}

结果完全符合预期。

public void printChildren() {
    ArrayList<Node> nodes = getAllChildren(this);
    System.out.println("size = "+nodes.size()+" {");
    for (Node n : nodes) {
        System.out.println("    "+n.getClass().getSimpleName());
    }
    System.out.println('}');
}

因此,我编写了此方法以仅获取Text对象。

size = 3 {
    Path
    Text
    Path
}

工作正常,并返回了Text对象。

所以我只需要setFill就可以了。

private Text findText(Parent parent) {
    for (Node n : parent.getChildrenUnmodifiable()) {
        if (n instanceof Text) {
            return (Text) n;
        } else if (n instanceof Parent) {
            Text p = findText((Parent) n);
            if (p != null) {
                return p;
            }
        }
    }
    return null;
}

但是每当我尝试设置textFill时,我都会得到一个RuntimeException:

public void setTextFill(Paint p) {
    findText(this).setFill(p);
}

仅设置文本的颜色需要花费一些时间。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

Control的内部是故意隐藏的。在这种情况下,Text节点的文本填充使用绑定保持最新。除非您在设置节点(fill之前取消绑定节点的text.fillProperty().unbind()属性,否则设置值将失败。

如果您想弄乱它们,应该使用Skin。假设您使用JavaFX版本9或更高版本,TextField的外观是公共API的一部分,则可以通过扩展它来访问textFill属性:

@Override
public void start(Stage primaryStage) {
    TextField textField = new TextField();

    textField.setSkin(new TextFieldSkin(textField) {
        {
            // use red color for text
            setTextFill(Color.RED);
        }

    });

    StackPane root = new StackPane(textField);

    Scene scene = new Scene(root, 500, 500);

    primaryStage.setScene(scene);
    primaryStage.show();
}

如果您想要具有公共TextField属性的fill子类型,请将此类JavaFX属性添加到您的子类中,并覆盖createDefaultSkin方法以返回{{1}的子类}为其TextFieldSkin属性创建绑定。