如果您打算建议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);
}
仅设置文本的颜色需要花费一些时间。
感谢您提供任何帮助。
答案 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
属性创建绑定。