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

时间:2019-03-24 20:23:43

标签: java javafx textfield

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

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

我还尝试将文本字段从屏幕上移开,但是确实可行,因为屏幕必须调整大小,所以我现在必须使用gridPane作为根目录,所以不再可能这样做。

只是想知道是否有任何方法可以使文本字段对用户不可见,但仍然允许它启用?

3 个答案:

答案 0 :(得分:0)

您可以使用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”是否可行。如果您的条形码扫描仪只是插入文本,也许更好的解决方案是添加事件处理程序并相应地处理击键:

EventHandler

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

答案 1 :(得分:0)

您实际上不需要在场景中使用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);
}

答案 2 :(得分:-1)