当我在下面使用术语非活动节点时,我的意思是不应该与用户交互的东西。
一个标签,数字键上方的打字标签既有按钮输入也有键盘输入。通过我迄今为止设计的方式,标签捕获键盘上的按键,因此必须保持焦点。不希望用户通过单击该标签使其接受按键来保持对该标签的关注。
其余标签应处于非活动状态:“登录”标题,“输入员工编号”消息以及日期和时间标签。
按钮都是交互式的:数字按钮,后退按钮,清除按钮,提交按钮和重置按钮。单击这些按钮时,它们会编辑打字标签文本并将焦点传回给它。
最后,应该有持有这些节点的非活动容器。
当显示此屏幕时,我希望用户能够在打字标签中键入数字,即使他们有意尝试从标签中删除焦点。我可以在屏幕node.mouseTransparent(boolean type);
或node.focusTraversable(boolean type)
上制作每个节点,但似乎应该有更好的方法来做到这一点。
如果不希望用户管理焦点,那么在具有非活动和交互节点的屏幕上记录按键和管理焦点的最佳方法是什么?
我想做这样的事情:
parent.mouseTransparent(true);
interactiveChild.mouseTransparent(false);
因为我希望父代码可以覆盖各种不活跃的孩子,但互动孩子仍然无法点击。
您可以在布局级别或场景级别为KeyEvent
s添加事件过滤器,并自行处理数字键的事件:
@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();
}
什么法比安说。您所说的是,只要JavaFX应用程序完全关注,您就希望将击键定向到提交按钮旁边的字段。
你需要一个包含其他元素的Pane的关键监听器。您需要其他元素才能取消任何击键事件,以便它们在冒泡阶段或涓滴阶段到达您。您需要侦听器直接或间接(通过另一个对象)访问键击所在的字段。您需要侦听器接收它接收的击键并将它们放入该字段中。您可以手动执行此操作,也可以将捕获的击键事件指向该字段。
当然,您还需要检查以确保它们是合法的(在您的情况下为数字?)以及您希望此窗口小部件具有的其他行为。
希望能够很好地概述要写什么以及如何实现目标。