英文:
How can I change how text is rendered in a TextField?
问题
我正在创建一个修改过的TextArea,它应该像控制台一样运行。为了分隔输出,我正在使用两个私用字符:U+FF100 和 U+FF101。
这些字符在屏幕上显示时需要是不可见的(即像零宽度空格)。我考虑过使用自定义字体,但我可能可以在我的代码中实现这一点。我应该如何做到这一点?
我正在使用JavaFX 14.0.2.1。
英文:
I'm creating a modified TextArea that should function like a console. To delineate output, I'm using two private-use characters: U+FF100 and U+FF101.
These characters need to be invisible when shown onscreen (i.e. like a zero-width space). I was thinking about a custom font, but I might be able to do this in my code. How do I go about doing this?
I'm using JavaFX 14.0.2.1.
答案1
得分: 2
RichTextFX有一个名为InlineCssTextArea的类,允许您为文本范围添加样式。您可以在这些范围上使用 display: none
(或JavaFX等效)。
我没有使用过它,但根据API,像这样的代码应该可以工作:
InlineCssTextArea textArea = new InlineCssTextArea(text);
textArea.textProperty().addListener((observable, oldValue, newValue) -> {
int index = textArea.getText().indexOf("\uDBBC\uDD00");
while(index >= 0) {
textArea.setStyle(0, index, index + 1, "display: none;");
index = textArea.getText().indexOf("\uDBBC\uDD00", index + 1);
}
}
如果您更喜欢使用 for loop
,也可以这样做。您会想要存储最后一个已设置样式的范围,以便在值更改时从该范围之后开始。
英文:
RichTextFX has the InlineCssTextArea class, which allows you to add style for text ranges. You could use display: none
(or the JavaFX equivalent) on the ranges.
I haven't used it, but based on the API, something like this should work:
InlineCssTextArea textArea = new InlineCssTextArea(text);
textArea.textProperty().addListener((observable, oldValue, newValue) -> {
int index = textArea.getText().indexOf("\uDBBC\uDD00");
while(index >= 0) {
textArea.setStyle(0, index, index + 1, "display: none;");
index = textArea.getText().indexOf("\uDBBC\uDD00", index + 1);
}
}
You could also use a for loop
if that is your preference. You would want to store the last range styled, so that when the value changes, you begin after that range.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论