java - 删除 TextArea 上的制表并转到下一个字段

标签 java javafx javafx-2 javafx-8

在 JavaFX8 中,我想知道当您按 Tab 并像 TextField 一样转到下一个字段时,如何可能不在 TextArea 中添加表格。

在JavaFX2中我用以下代码解决了这个问题

public class TabTextAreaSkin extends TextAreaSkin implements Skin<TextArea> {

public TabTextAreaSkin(final TextArea textArea) {
    super(textArea);
    textArea.focusedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observableValue, Boolean aBoolean, Boolean aBoolean2) {
            if (!aBoolean2) {
                textArea.deselect();
            }
        }
    });
    textArea.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            if (event.getCode() == KeyCode.TAB) {
                SkinBase skin = (SkinBase) textArea.getSkin();
                if (skin.getBehavior() instanceof TextAreaBehavior) {
                    TextAreaBehavior behavior = (TextAreaBehavior) skin.getBehavior();
                    if (event.isShiftDown()) {
                        behavior.callAction("InsertTab");
                    } else {
                        behavior.callAction("TraverseNext");
                    }
                    event.consume();
                }
            }
        }
    });
}

}

但在 JavaFX8 中,SkinBase 上没有 getBehavior() 方法。所以我不知道该怎么办。有人得到解决方案吗?

最佳答案

尝试使用com.sun.javafx.scene.traversal.TraversalEngine。请注意,这仅供内部使用。

final TextArea area = new TextArea();
final TraversalEngine engine = new TraversalEngine(root, false);
final KeyCombination kc = new KeyCodeCombination(KeyCode.TAB);

area.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {

    @Override
    public void handle(KeyEvent event) {
        if (kc.match(event)) {
            engine.trav(area, Direction.NEXT);
            event.consume();
        }
    }
});

另一种麻烦但安全的方法是:

area.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {

    @Override
    public void handle(KeyEvent event) {
        if (kc.match(event)) {
            int ind = vBox.getChildren().indexOf(area);
            Node next = vBox.getChildren().get(ind + 1);
            next.requestFocus();
            event.consume();
        }
    }
});

关于java - 删除 TextArea 上的制表并转到下一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23055702/

相关文章:

java - Keycloak 适配器 pkix 路径构建失败

java - 使用java将csv文件导入oracle数据库

java - 在双链表中插入节点

java - 如何在 JavaFX 中使用 try-catch?

javafx-2 - JavaFX 折线图中的空指针异常

java - 如何在 do while 循环中通过输入验证形成数组?

javafx - JavaFX 的成功案例

JavaFX - 线程挂起,我不知道如何在 UI 线程之外运行循环

javafx-2 - 用 TextField 中的数字替换文本

java - 从 FXML 设置 TableView 通用类型?