当我在下面使用术语“非活动节点”时,我的意思是某些不应该与用户交互的东西。
一个标签,即数字键上方的键入标签既可以进行按钮输入,也可以进行键盘输入。到目前为止,按照我设计的方式,标签会捕获键盘上的按键,因此必须保持焦点。不应期望用户通过单击该标签来使其接受按键来保持焦点。
其余标签应处于非活动状态:“ LOGIN”标题,“ Enter Employee Number”消息以及日期和时间标签。
这些按钮都是交互式的:数字按钮,后退按钮,清除按钮,提交按钮和重置按钮。单击这些按钮后,它们将编辑键入标签文本并将焦点传递回给它。
最后,应该有保存这些节点的不活动容器。
显示此屏幕时,我希望用户即使有意试图从标签上移开焦点,也能够在键入标签中键入数字。我可以使屏幕上的每个节点都node.mouseTransparent(boolean type);
或node.focusTraversable(boolean type)
,但似乎应该有一个更好的方法。
如果不希望用户管理焦点,在具有非活动和交互式节点的屏幕上记录按键和管理焦点的最佳方法是什么?
我想做这样的事情:
parent.mouseTransparent(true);
interactiveChild.mouseTransparent(false);
我希望父代码能够涵盖各种非活动子项,但交互式子项仍然不可点击。
答案 0 :(得分:2)
您只需在布局级别或场景级别为KeyEvent
添加事件过滤器,然后自己处理数字键的事件:
@Override
public void start(Stage primaryStage) throws Exception {
GridPane grid = new GridPane();
TextField textField = new TextField();
grid.add(textField, 0, 0, 3, 1);
for (int i = 0; i < 9; i++) {
Button button = new Button(Integer.toString(9 - i));
button.setOnAction(evt -> textField.appendText(button.getText()));
grid.add(button, i % 3, i / 3 + 1);
}
Button button = new Button("0");
button.setOnAction(evt -> textField.appendText("0"));
grid.add(button, 1, 4);
grid.addEventFilter(KeyEvent.ANY, evt -> {
// consume every press of a digit key and handle the release for
// adding the text
if (evt.getEventType() == KeyEvent.KEY_TYPED) {
String text = evt.getCharacter();
if (text.length() == 1 && Character.isDigit(text.charAt(0))) {
evt.consume();
textField.appendText(text);
}
} else if (evt.getCode().isDigitKey()) {
evt.consume();
}
});
Scene scene = new Scene(grid);
primaryStage.setScene(scene);
primaryStage.show();
}
答案 1 :(得分:1)
Fabian怎么说。您的意思是,只要JavaFX应用程序完全具有焦点,您就希望将击键定向到“提交”按钮旁边的字段中。
您需要一个包含其他元素的窗格的关键侦听器。您需要其他元素不取消任何击键事件,以便它们在冒泡阶段或the流阶段到达您。您需要侦听器直接或间接(通过另一个对象)访问要在其上显示击键的字段。您需要侦听器进行接收的击键并将其放入该字段。您可以手动执行此操作,也可以将捕获的按键事件定向到该字段。
当然,您还需要检查以确保其合法(您的情况是数字?)以及您希望此小部件具有的其他任何行为。
希望可以让您很好地概述编写内容以及如何实现目标。