Как сделать текстовое поле JavaFX невидимым, но все же разрешить ввод текста в него - PullRequest
0 голосов
/ 24 марта 2019

У меня есть приложение javaFX, которое принимает данные со сканера штрих-кода. Сканер штрих-кода распознается как клавиатура и всегда следует за его вводом с новой строки после того, как любой штрих-код отсканирован (поэтому инициируется событие onAction).

На данный момент у меня есть текстовое поле, которое всегда сфокусировано и связано со сканером штрих-кода, однако я бы хотел, чтобы это было скрыто от пользователя. Я пытался использовать setVisible (False), но это, кажется, отключает текстовое поле (onAction не запускается и текстовое поле всегда пусто)

Я также пытался убрать текстовое поле за пределы экрана, что сработало, однако, поскольку экран должен быть изменяемого размера, теперь я должен использовать gridPane в качестве корня, так что это больше невозможно сделать.

Просто интересно, есть ли способ сделать текстовое поле невидимым для пользователя, но все же разрешить его включение?

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

Попробуйте использовать TextField.setText (java.lang.String) .

0 голосов
/ 25 марта 2019

На самом деле вам не нужно иметь 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);
}
0 голосов
/ 25 марта 2019

У вас есть несколько возможностей скрыть текстовое поле с помощью 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");

С другой стороны, я действительно спрашиваю себя, можно ли пойти этим взломом Если ваш сканер штрих-кода просто вставляет текст, возможно, лучшим решением будет добавить обработчик событий и соответственно обработать нажатия клавиш:

EventHandler

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