如何强制JavaFX ComboBox失去焦点?

3
我希望我的JavaFX ComboBox 在选中后失去焦点。有什么想法吗?

1
据我所知,你只需要请求另一个组件的焦点即可。 - James_D
不得不进行虚拟编辑以取消我的踩票 :-) - kleopatra
@kleopatra,当您再次点赞之前的踩时,它会提示什么? - Uluk Biy
@UlukBiy 嗯...不太确定我是否理解:要撤销(上/下)投票,我必须再次点击上/下三角形符号:没有提示,它只是被移除了。一旦投票被锁定(通常的5分钟宽限期),只有在帖子被编辑后才能这样做。 - kleopatra
1个回答

3

不幸的是,javafx没有公共api,可以以编程方式从一个节点中将焦点转移离开。作为解决方法——正如James_D所建议的那样——就是明确要求将焦点转移到另一个节点:

node.requestFocus();

这样做意味着调用代码知道节点(在OP的上下文中似乎是这种情况)。

实际上,Scene 上有提供所需功能的 API。缺点是:它是 package private 的,需要使用 com.sun.xx 层次结构中的 Direction 类。因此,如果你愿意(并且被允许)冒险,另一种选择是通过反射调用该 api:

/**
 * Utility method to transfer focus from the given node into the
 * direction. Implemented to reflectively (!) invoke Scene's
 * package-private method traverse. 
 * 
 * @param node
 * @param next
 */
public static void traverse(Node node, Direction dir) {
    Scene scene = node.getScene();
    if (scene == null) return;
    try {
        Method method = Scene.class.getDeclaredMethod("traverse", 
                Node.class, Direction.class);
        method.setAccessible(true);
        method.invoke(scene, node, dir);
    } catch (NoSuchMethodException | SecurityException 
            | IllegalAccessException | IllegalArgumentException 
            | InvocationTargetException e) {
        e.printStackTrace();
    }
}

// usage, f.i. on change of selection of a comboBox 
combo.getSelectionModel().selectedItemProperty().addListener((source, ov, nv) -> {
    traverse(combo, Direction.NEXT);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接