【问题标题】:Managing focus with label and buttons - Display key press in label使用标签和按钮管理焦点 - 在标签中显示按键
【发布时间】:2018-09-06 02:17:01
【问题描述】:

当我在下面使用术语非活动节点时,我的意思是不能与用户交互的东西。

我构建了一个与此类似的通用登录屏幕:

一个标签,数字键上方的打字标签同时接受按钮输入和键盘输入。到目前为止,按照我设计的方式,标签会捕获键盘上的按键,因此必须保持焦点。用户不应通过单击此标签以使其接受按键来保持对该标签的关注。

其余标签应处于非活动状态:“LOGIN”标题、“Enter Employee Number”消息以及日期和时间标签。

这些按钮都是交互式的:数字按钮、后退按钮、清除按钮、提交按钮和重置按钮。单击这些按钮时,它们会编辑输入标签文本并将焦点传回给它。

最后,应该有存放这些节点的非活动容器。

当显示此屏幕时,我希望用户能够在输入标签中输入数字,即使他们有意尝试从标签中移除焦点。我可以将屏幕上的每个单独节点设为node.mouseTransparent(boolean type);node.focusTraversable(boolean type),但似乎应该有更好的方法来做到这一点。

如果不希望用户管理焦点,那么在同时具有非活动节点和交互节点的屏幕中记录按键和管理焦点的最佳方式是什么?

我想这样做:

parent.mouseTransparent(true);
interactiveChild.mouseTransparent(false);

因为我希望父代码能够涵盖各种不活动的孩子,但交互式孩子仍然无法点击。

【问题讨论】:

  • 你最好添加一些代码sn-ps来帮助我们理解你的问题,首先为什么你需要设置鼠标透明?无论如何,用户都可以使用键盘上的 Tab 按钮更改焦点,只要您单击屏幕上的按钮或键盘上的按钮,如果这对您有帮助,您都可以将焦点强制集中到键入标签文本上我可以提供一些代码来帮助您
  • 请提供一个minimal reproducible example 来说明问题。

标签: javafx focus keyevent


【解决方案1】:

您可以简单地在布局级别或场景级别为KeyEvents 添加一个事件过滤器,然后自己处理数字键的事件:

@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();
}

【讨论】:

    【解决方案2】:

    fabian 说了什么。您的意思是,只要 JavaFX 应用程序有焦点,您就希望将击键定向到提交按钮旁边的字段中。

    您需要一个包含其他元素的窗格的键侦听器。您需要其他元素不取消任何击键事件,以便它们在冒泡阶段或涓滴阶段到达您。您需要侦听器直接或间接(通过另一个对象)访问要出现击键的字段。您需要侦听器接收它接收到的击键并将它们放入该字段中。您可以手动或通过将捕获的击键事件定向到该字段来执行此操作。

    当然,您还需要检查以确保它们是合法的(在您的情况下是数字?)以及您希望此小部件具有的任何其他行为。

    希望这能让您很好地了解要写什么以及如何实现目标。

    【讨论】:

    • 感谢您提供帮助 :) 只是几个 cmets 如何提高您的回答技巧,没有特定的顺序:a) 不要重复其他答案(特别是不要通过解释解决方案在代码中给出的文字中)b)使用适当的术语(即它是“消耗”一个事件而不是“取消”,或者“捕获阶段”而不是“涓滴”)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多