我有一个javaFX应用程序,它从条形码扫描仪获取输入。条码扫描器被识别为键盘,并且在扫描任何条码后始终跟随其换行符(因此会触发onAction事件)。
目前,我有一个始终聚焦并链接到条形码扫描仪的文本字段,但是我希望对用户隐藏该文本字段。我尝试使用setVisible(False),但是这似乎禁用了文本字段(未触发onAction且文本字段始终为空)
我还尝试将文本字段从屏幕上移开,但是确实可行,因为屏幕必须调整大小,所以我现在必须使用gridPane作为根目录,所以不再可能这样做。
只是想知道是否有任何方法可以使文本字段对用户不可见,但仍然允许它启用?
答案 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)