如何使 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
。事实上,我不建议这样做,因为这会干扰焦点并可能影响布局。
相反,我会向场景添加一个侦听器(或场景的根节点,确保它或后代可以通过将 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);
}
我有一个从条形码扫描器获取输入的 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
。事实上,我不建议这样做,因为这会干扰焦点并可能影响布局。
相反,我会向场景添加一个侦听器(或场景的根节点,确保它或后代可以通过将 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);
}