【问题标题】:Set text color of JavaFX TextField without CSS设置没有 CSS 的 JavaFX TextField 的文本颜色
【发布时间】:2021-01-22 07:32:15
【问题描述】:

我最近在 JavaFX 方面做了很多工作,只编写代码——没有 CSS 没有 FXML,我想保持这种方式。我已经设法以这种方式完成了所有我想要的事情,除了现在我无法在不使用 CSS 的情况下设置 TextField 的文本颜色,所以我在这里寻求建议。有没有办法做到这一点,不管它有多hacky?

请注意,我仍在使用 Java 8 版本。

【问题讨论】:

  • “只写代码——没有 CSS 没有 FXML,我想保持这种方式”——那么 JavaFX 可能不适合你。将“稳定”和“高效”添加到您的愿望清单中,您就离 JaxaFX 越来越远了……

标签: java-8 javafx-8 textfield


【解决方案1】:

考虑到您的观点:“没有 CSS”和“它可以有多 hacky..”是实现文本着色的一种方法。

import com.sun.javafx.scene.control.skin.TextFieldSkin;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TextField_TextColor_Demo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        TextField textField = new TextField();
        textField.setSkin(new TextFieldSkin(textField){
            @Override
            protected void layoutChildren(double x, double y, double w, double h) {
                super.layoutChildren(x, y, w, h);
                if(textField.getProperties().get("colorChanged")==null) {
                    textFill.setValue(Color.RED);
                    textField.getProperties().put("colorChanged",true);
                }
            }
        });
        StackPane root = new StackPane(textField);
        Scene scene = new Scene(root, 300,300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String... args){
        Application.launch(args);
    }
}

【讨论】:

  • 正是我想要的。
【解决方案2】:

我无法让它工作。但提出了另一种解决方案。虽然插入符号的颜色也会改变。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.skin.TextFieldSkin;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;

public class TextField_TextColor_Demo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        TextField txt = new TextField();
        CustomTextFieldSkin skin = new CustomTextFieldSkin(txt);
        txt.setSkin(skin);
        skin.setHighlight(Color.RED);
        HBox box = new HBox(txt);;
        Scene scene = new Scene(box, 300, 100);
        stage.setScene(scene);
        stage.show();
    }
    
    public class CustomTextFieldSkin extends TextFieldSkin{
        public CustomTextFieldSkin(TextField textField) {
            super(textField);
        }
        public void setHighlight(Paint value) {
            setTextFill(value);         
        }
    }
    
     public static void main(String... args){
            Application.launch(args);
     }
 
}

根据这两个答案,似乎可以单独为插入符号着色:

https://stackoverflow.com/a/47876289/7989121

https://stackoverflow.com/a/27323035/7989121

虽然两者都使用 caretPath,但我无法使用它,因为根据我的 IDE 它不可见

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 2014-09-02
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多