Javafx Text多字着色

时间:2013-02-26 05:18:55

标签: java colors javafx

好的,我有一个ListView对象。我正在使用它作为我的服务器的一种控制台窗口。这是我能想到的唯一一种在这样的盒子中显示彩色文本的方法。到目前为止,这项工作很精彩。现在我想要做的是在一个索引或行上为不同的文本着色。

示例:

listView[0] = "Hello " + "world";

Hello ”为绿色,“世界”为蓝色。如果这可以用usine javafx文本或任何其他方式我想知道如何去做。我正在使用Javafx Text作为主要元凶,因为你可以用它自定义这么多。

我希望每个人都能理解我在这里要做的事情,如果没有,请告诉我,我会尝试重新改写一下。

感谢jewelsea,我能够找到解决方案。我采用了一种不同的方法,而不是使用cellfactory。

的ListView

ListView<FlowPane> consoleWindow = new ListView<>();
ArrayList<FlowPane> consoleBuffer = FXCollections.observableArrayList();

consoleWindow.setItems(consoleBuffer);

inputBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent keyEvent) {
           if (keyEvent.getCode() == KeyCode.ENTER) {
                consoleBuffer.add(parseInput.parseInputToArray(inputBox.getText()));
           }
            consoleWindow.scrollTo(consoleBuffer.size());
        }
});

ConsoleInputParse

public class ConsoleInputParse {

    private String[] wordList = {};

    public ConsoleInputParse() {}

    public FlowPane parseInputToArray(String input) {
        wordList = input.trim().split("[ ]+");

        return colorize();
    }

    public FlowPane colorize() {

        ArrayList<Text> textChunks = new ArrayList<>();
        FlowPane bundle = new FlowPane();

        //Todo: use regex to check for valid words
        for (String word : wordList) {
            String spaced = word + " ";
            switch (word) {
                case "Hello": case "hello":
                    textChunks.add(customize(spaced, "purple"));
                    break;
                case "World": case "world":
                    textChunks.add(customize(spaced, "blue"));
                    break;
                case "Stack Overflow":
                    textChunks.add(customize(spaced, "orange", "Arial Bold", 15));
                default:
                    textChunks.add(customize(spaced, "black", "Arial",  13));
                    break;
            }
        }

        bundle.getChildren().addAll(textChunks);
        return bundle;
    }

    public Text customize(String word, String color) {
        return TextBuilder.create().text(word).fill(Paint.valueOf(color)).build();
    }

    public Text customize(String word, String color, String font) {
        return TextBuilder.create()
                .text(word)
                .fill(Paint.valueOf(color))
                .font(Font.font(font, 12)).build();
    }

    public Text customize(String word, String color, String font, int fontSize) {
        return TextBuilder.create()
                .text(word)
                .fill(Paint.valueOf(color))
                .font(Font.font(font, fontSize)).build();
    }

}

1“工作示例”

1 个答案:

答案 0 :(得分:9)

为您的cellfactory创建一个自定义ListView,让它生成包含FlowPane个不同Text个实例的单元格,每个实例都有不同的样式。我创建了一个sample来演示这种方法。

示例输出:

colorized text

Java 8中,您可以使用TextFlow设置文字样式,而不是Text中不同FlowPane个实例的组合。