JavaFX TextArea: how to set tabulation width

十年热恋 提交于 2019-12-23 08:52:10

问题


How do I set tab width of JavaFX TextArea ?

When I use tabulation (tab key) in TextArea, the width of the tabulation is wide. I want to control the width, i.e., use 4 spaces. In the documentation I could not find a method to do this.

I tried this code (where taInput is a TextArea), but it is not working as it should:

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();
        }
    }
});

回答1:


Finally I found a way to do this.

It seems that the setOnKeyPressed() method is not good for this task because the event is handled after the keyPress action is executed.

The addEventFilter() handles the events before their actions are executed, so you can manipulate the events.

My new code:

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();
        }
    }
});



回答2:


@tenotron

your code also executes same logic for combination of TAB key with set of modifiers ( shift, control, alt, meta or shortcut). Meaning In TextArea

Pressing TAB key = Ctrl(modifier) + TAB = .... = your logic.

To fix this issue , you have to use KeyCombination

Sample Code :

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();
                }
            }
        });

now Pressing TAB key results "I am not Real TAB" , ctrl+TAB will highlight the next Node on the scene.

Reference :

Correctly Checking KeyEvents

KeyCombination



来源:https://stackoverflow.com/questions/13773483/javafx-textarea-how-to-set-tabulation-width

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!