如何使 JavaFX 文本字段不可见但仍允许在其中输入文本

How to make a JavaFX textfield not visible but still allow text to be entered into it

我有一个从条形码扫描器获取输入的 javaFX 应用程序。条形码扫描器被识别为键盘,并且在扫描任何条形码后始终在其输入后跟一个换行符(因此触发 onAction 事件)。

目前我有一个始终聚焦并链接到条形码扫描仪的文本字段,但是我希望它对用户隐藏。我尝试使用 setVisible(False) 但这似乎禁用了文本字段(未触发 onAction 并且文本字段始终为空)

我也试过将文本字段从屏幕上移开,这确实有效,但是因为屏幕必须可调整大小,我现在必须使用 gridPane 作为根,所以它不可能再这样做了。

只是想知道是否有办法使文本字段对用户不可见但仍允许启用它?

您可以使用 css 隐藏文本字段。最简单的是将不透明度设置为 0

TextField.css

.hidden{
    -fx-opacity: 0;
}

Java

GridPane root = new GridPane();
// Add stylesheet
root.getStylesheets().add("TextField.css");

TextField textField = new TextField();
// Add class
textField.getStyleClass().add("hidden");

另一方面,我真的会问自己 "hack" 是否可行。如果您的条码扫描仪只是简单地插入文本,也许更好的解决方案是添加一个事件处理程序并相应地处理击键:

事件处理器

root.addEventHandler(KeyEvent.ANY,(event)->{
    System.out.println(event);
});

尝试使用 TextField.setText(java.lang.String)

您实际上不需要在场景中有 TextField。事实上,我不建议这样做,因为这会干扰焦点并可能影响布局。

相反,我会向场景添加一个侦听器(或场景的根节点,确保它或后代可以通过将 focusTraversable 属性 设置为 true,如有必要)。如果使用 KEY_PRESSED 的节点可能具有焦点,则您可能需要使用事件过滤器:

@Override
public void start(Stage primaryStage) throws IOException {
    StackPane root = new StackPane(new Button());
    Scene scene = new Scene(root);

    final StringBuilder string = new StringBuilder();
    scene.addEventFilter(KeyEvent.KEY_PRESSED, evt -> {
        KeyCode code = evt.getCode();
        if (code.isDigitKey()) {
            // input part of the information
            String name = code.toString();
            string.append(name.charAt(name.length() - 1)); // make sure numpad keys do not 
        } else if (code == KeyCode.ENTER) {
            // submit input
            submitCode(string.toString());
            string.setLength(0);
        }
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}

private void submitCode(String code) {
    System.out.println(code);
}