7

如何设置 JavaFX TextArea的标签宽度?

当我在 TextArea 中使用制表(制表键)时,制表的宽度很宽。我想控制宽度,即使用 4 个空格。在文档中,我找不到执行此操作的方法。

我尝试了这段代码(其中 taInput 是一个 TextArea),但它不能正常工作:

taInput.setOnKeyPressed(new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent e) {
        if (e.getCode() == KeyCode.TAB) {
            // TAB SPACES
            StringBuilder sb = new StringBuilder(config.getTabSpacesCount());
            for (int i=0; i<config.getTabSpacesCount(); i++) {
                sb.append(' ');
            }
            taInput.insertText(taInput.getCaretPosition(), sb.toString());
            e.consume();
        }
    }
});
4

3 回答 3

5

最后我找到了一种方法来做到这一点。

似乎 setOnKeyPressed() 方法不适用于此任务,因为事件是在执行 keyPress 操作之后处理的。

addEventFilter() 在事件执行之前处理事件,因此您可以操纵事件。

我的新代码:

taInput.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent e) {
        if (e.getCode() == KeyCode.TAB) {
            String s = StringUtils.repeat(' ', config.getTabSpacesCount());
            taInput.insertText(taInput.getCaretPosition(), s);
            e.consume();
        }
    }
});
于 2012-12-09T02:20:25.730 回答
1

@tenotron

您的代码还为 TAB 键与一组修饰符(shift、control、alt、meta 或快捷方式)的组合执行相同的逻辑。TextArea 中的含义

按 T​​AB 键 = Ctrl(修饰符) + TAB = .... = 你的逻辑。

要解决此问题,您必须使用KeyCombination

示例代码:

textArea.addEventFilter(KeyEvent.KEY_PRESSED,
                new EventHandler<KeyEvent>() {
                    final KeyCombination combo = new KeyCodeCombination(
                            KeyCode.TAB);
            @Override
                    public void handle(KeyEvent event) {
                          // check for only tab key
                        if (combo.match(event)) {
                            textArea.insertText(textArea.getCaretPosition(),
                                    "I am not real TAB");
                            event.consume();
                }
            }
        });

现在按 TAB 键结果 "I am not Real TAB" , ctrl+TAB 将突出显示场景中的下一个节点。

参考 :

正确检查 KeyEvent

组合键

于 2012-12-09T17:55:59.150 回答
0

尝试将您想要的内容显示为字符串。s.replace("\t", " "); 如果你想要四个空格,然后使用。这对我有用。

于 2020-10-20T15:56:34.377 回答