如何仅更改 javafx TextField 中最后一个字符的颜色

Posted

技术标签:

【中文标题】如何仅更改 javafx TextField 中最后一个字符的颜色【英文标题】:How to only change color of the last character in a javafx TextField 【发布时间】:2022-01-16 12:04:23 【问题描述】:

我正在尝试制作一个打字游戏,我为用户输入创建了一个文本字段,并尝试制作游戏,以便文本字段的最后一个字符如果与单词中的相应字符不匹配,则为红色被输入。以下是我目前拥有的相关节点类型。

Label wordsToType = new Label();
TextField userInput = new TextField();
StringBuilder wordsTyped = new StringBuilder();
TextField lastChar = new TextField();

userInput.setOnKeyReleased(e -> 
    wordsTyped.append(userInput.getText()); // words typed is a string builder of what is in userInput

    if (wordsTyped.toString().charAt(wordsTyped.length() - 1) - wordsToType.getText().charAt(wordsTyped.length() - 1) != 0) 
        lastChar.setText(e.getText());
        lastChar.setStyle("-fx-text-fill: red; -fx-font-size: 16px;");
        wordsTyped.setLength(wordsTyped.length() - 1); // deletes last char from wordsTyped
        userInput.setText(wordsTyped.toString() + lastChar.getText());
        userInput.end();
    
    wordsTyped.delete(0, wordsTyped.length());
);

【问题讨论】:

TextFieldTextArea 对于所有文本只能有一种样式,至少在它们的默认皮肤是如何实现的情况下。要拥有具有多种样式的文本,您可能需要使用 TextFlow 加上多个 Text 节点来研究。还有一个名为 RichTextFX 的库,它可以提供你想要的。 也就是说,一个文本域中选中的文本与域中其他文本的样式不同,两者的样式都可以通过css独立配置。也许您可以选择该字段中的最后一个字符。它可能对您有帮助,也可能没有。 @Slaw 我为RichTextFX添加了示例代码 【参考方案1】:

如 cmets 中所述,您可以使用 RichTextFX 突出显示不同样式的输入文本。这是一个示例代码:

Java:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.fxmisc.richtext.StyleClassedTextField;
import org.fxmisc.richtext.StyledTextField;
import org.fxmisc.richtext.model.StyleSpans;
import org.fxmisc.richtext.model.StyleSpansBuilder;

import java.util.Collection;
import java.util.Collections;

public class HighlightedTextFieldExample extends Application 

    @Override
    public void start(Stage stage) 
        StyledTextField<Collection<String>, Collection<String>> textField = new StyleClassedTextField();
        textField.lengthProperty().addListener((observableValue, oldValue, newValue) -> 
            if (newValue > 0) 
                StyleSpans<Collection<String>> styleSpans = new StyleSpansBuilder<Collection<String>>()
                        .add(Collections.emptyList(), newValue - 1) // no style (leading characters)
                        .add(Collections.singleton("last-character"), 1) // add a style class for the last character
                        .create();
                textField.setStyleSpans(0, styleSpans);
            
        );
        textField.setPrefWidth(400);

        Scene scene = new Scene(textField);
        scene.getStylesheets().add(HighlightedTextFieldExample.class.getResource("highlighting.css").toExternalForm());
        stage.setScene(scene);
        stage.setTitle("Last Character Highlighting Example");
        stage.show();
    

    public static void main(String[] args) 
        launch();
    

CSS 样式文件 (highlighter.css):

.last-character 
    -fx-fill: red;

输出:

【讨论】:

以上是关于如何仅更改 javafx TextField 中最后一个字符的颜色的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX TextArea & TextField 显示不同的颜色

如何在 onfocus 和 outfocus 时在 JavaFX TextField 上执行任务?

打开菜单时,JavaFX 焦点在 TextField 上的变化

JavaFX中的可复制Label / TextField / LabeledText

java JavaFX - 在JavaFX TextField中设置提示(提示)int

单击 JavaFX 突出显示 TextField 中的所有文本