如何编码字符串以显示颜色文本(基于String中的前缀)

时间:2018-01-17 19:56:41

标签: java string javafx text colors

我是Java的新手,我正在努力完成以下任务。 我正在编写一个应用程序,它将用户的输入(取决于一个人的选择)编码到Quake III Arena中的命令行解释器中编译的代码中,使玩家能够根据以下字符前缀对着色字母进行着色(例如“^ 0Black ^ 3Yellow) ^ 0黑色 ^ 1白色 ^ 2绿色 ^ 3黄色 ^ 4蓝色 ^ 5青色(浅蓝色) ^ 6 MAGENTA紫色 ^ 7白色 That is how app looks in current stage

代码工作正常但我想根据输入生成一个Color Text,它会通过单击generate来预览Nick的当前外观。

经过几次尝试后我放弃了,我不明白如何处理这个问题。任何事情都会受到高度赞赏。我希望我足够具体。谢谢你。

1 个答案:

答案 0 :(得分:0)

您可以使用regular expression提取文本部分,然后构建包含不同颜色文本元素的文本流。

这是一个演示。正则表达式查找两个不同的命名组:可选^后跟(名为“colIndex”)数字,然后(命名为“text”)任何非零序列的字符不等于^ 。文本字段上的监听器只是迭代匹配并构建Text元素。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class TextFieldRegexExample extends Application {

    @Override
    public void start(Stage primaryStage) {

        Color[] colors = new Color[] {Color.BLACK, Color.WHITE, Color.GREEN, Color.YELLOW, Color.BLUE, Color.CYAN, Color.PURPLE};

        TextField textField = new TextField();
        Pattern pattern = Pattern.compile("(\\^(?<colorIndex>\\d))?(?<text>[^(\\^\\d)]+)");

        TextFlow textFlow = new TextFlow();

        textField.textProperty().addListener((obs, oldValue, newValue) -> {
            Matcher matcher = pattern.matcher(newValue);

            textFlow.getChildren().clear();

            while(matcher.find()) {
                String color = matcher.group("colorIndex");
                String text = matcher.group("text");
                Text t = new Text(text+" ");
                if (color != null && color.matches("\\d+")) {
                    int colIndex = Integer.parseInt(color);
                    if (colIndex >= 0 && colIndex < colors.length) {
                        t.setFill(colors[colIndex]);
                    }
                }
                textFlow.getChildren().add(t);
            }
        });

        VBox root = new VBox(5, textField, textFlow);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

enter image description here