You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX TextField的-fx-text-fill样式失效问题求助

JavaFX TextField文本颜色样式问题排查

场景描述

Scene 包含一个 VBox,VBox 内有一个 HBox,HBox 包含3个子节点。每个子节点都是继承自 StackPane 的自定义类 S1,内部包含一个 TextField。HBox 通过 setStyle 设置样式为 -fx-background-color:magenta;,所有 TextField 都通过 setStyle 设置 -fx-text-fill:yellow;-fx-background-color:pink;。第一个 S1 的样式为空,第二个 S1 设置 -fx-background-color:green;,第三个 S1 设置 -fx-font-size:20;。

代码实现

public class Test extends Application {  
  static public void main(String[] args) { Application.launch(args); }
  public Test(){ } 
  public class S1 extends StackPane {
    public S1(String style, String text) {
      TextField textField = new TextField(text);
      textField.setEditable(false);
      textField.setStyle("-fx-text-fill:yellow;-fx-background-color:pink;");
      getChildren().setAll(textField);
      setStyle(style);
    }
  }
  @Override
  public void start(Stage stage) {
    VBox vb = new VBox();
    stage.setScene(new Scene(vb, 600, 100));
    stage.show();
    vb.requestFocus();
    HBox hb1 = new HBox(new S1("", "AA "), new S1("-fx-background-color:green;", "BB"), new S1("-fx-font-size:20;", "CC"));
    hb1.setStyle("-fx-background-color:magenta;");
    vb.getChildren().add(hb1);
  }
  @Override
  public void stop() { }
}

预期与实际结果

  • 预期结果:3个 TextField 的文本均为黄色
  • 实际结果:第一个 TextField 文本为黄色,后两个为黑色

提问背景

本人是退休汇编程序员,自学 Java 与面向对象编程,无法定位问题原因,想请教这是代码疏漏还是 BUG?

环境信息

Windows 11、Java jdk-17.0.4.1、javafx-sdk-20.0.2、Eclipse Version: 2021-12 (4.22.0)


问题原因与解决方案

这不是BUG,是代码中对JavaFX TextField样式属性的误用导致的。

JavaFX里,TextField的输入文本颜色不由-fx-text-fill控制,而是由-fx-text-inner-color属性决定。你给TextField设置的-fx-text-fill在第一个实例中生效,只是因为父节点S1没有样式时的意外继承效果;当S1设置了样式后,这种意外继承被打破,TextField就会显示默认的黑色文本。

解决方法很直接,把TextField样式里的-fx-text-fill:yellow替换成-fx-text-inner-color:yellow即可,修改后的S1构造函数代码如下:

public S1(String style, String text) {
  TextField textField = new TextField(text);
  textField.setEditable(false);
  // 替换文本颜色属性
  textField.setStyle("-fx-text-inner-color:yellow;-fx-background-color:pink;");
  getChildren().setAll(textField);
  setStyle(style);
}

修改后三个TextField的文本都会显示为黄色,符合预期。

补充说明:-fx-text-fill一般用于设置Label这类节点本身的文本颜色,而TextField、PasswordField这类带输入区域的控件,输入文本的颜色需要用专门的-fx-text-inner-color属性,这是JavaFX控件样式的常规规则。

内容的提问来源于stack exchange,提问作者GreySloth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:47:12