【问题标题】:JavaFX CheckBoxTree in popup of drop-down Button下拉按钮弹出窗口中的 JavaFX CheckBoxTree
【发布时间】:2016-08-29 11:55:41
【问题描述】:

为了让最终用户将搜索限制在主 TableView 的某些列,我需要一个带有复选框的树形视图。 我决定将此 TreeView 嵌入到弹出窗口中,单击自定义按钮时显示。

受问题启发,我创建了以下课程: Java FX8 TreeView in a table cell

public class CustomTreeMenuButton extends MenuButton {
    private PopupControl popup = new PopupControl();
    private TreeView<? extends Object> tree;
    private CustomTreeMenuButton me = this;

    public void setTree(TreeView<? extends Object> tree) {
        this.tree = tree;
    }

    public CustomTreeMenuButton() {
        super();
        this.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {
                if (!popup.isShowing()) {

                    Bounds b = me.localToScreen(me.getBoundsInLocal());
                    double x = b.getMinX();
                    double y = b.getMaxY();

                    popup.setAutoHide(true);
                    // popup.setAutoFix(true);
                    popup.setAnchorX(x);
                    popup.setAnchorY(y);

                    popup.setSkin(new Skin<Skinnable>() {
                        @Override
                        public void dispose() {
                        }

                        @Override
                        public Node getNode() {
                            return tree;
                        }

                        @Override
                        public Skinnable getSkinnable() {
                            return null;
                        }
                    });

                    popup.show(me.getScene().getWindow());
                }
            }
        });
    }
}

我正在使用的树包含CheckBoxTreeItem 对象,当弹出窗口工作时,所有复选框上都会出现一些奇怪的模糊,只要焦点不在复选框上。 (见下面的 GIF)

首先,我认为这可能是一个抗锯齿问题,但 popup.getScene().getAntiAliasing().toString() 返回 DISABLED

然后,我看到非整数锚点可能会导致问题。然而popup.setAutoFix(true) 什么也没做,以下也没有做:

popup.setAnchorX(new Double(x).intValue());
popup.setAnchorY(new Double(y).intValue());

值得注意的是,我正在使用 FXML。

无论焦点如何,我如何才能获得清晰的复选框?

【问题讨论】:

    标签: java checkbox javafx treeview antialiasing


    【解决方案1】:

    我建议使用内置控件CustomMenuItem,而不是重新发明轮子:

    允许在其中嵌入任意节点的 MenuItem, 通过将节点分配给内容属性。

    一个例子

    // Create the tree
    CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem<String>("All stuff");
    rootItem.setExpanded(true);                  
    
    final TreeView<String> tree = new TreeView<String>(rootItem);  
    tree.setEditable(true);
    
    tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());    
    for (int i = 0; i < 8; i++) {
        final CheckBoxTreeItem<String> checkBoxTreeItem = 
                new CheckBoxTreeItem<String>("Stuff" + (i+1));
        rootItem.getChildren().add(checkBoxTreeItem);                
    }
    
    tree.setRoot(rootItem);
    tree.setShowRoot(true);
    
    // Create a custom menu item
    CustomMenuItem customMenuItem = new CustomMenuItem(tree);
    customMenuItem.setHideOnClick(false);
    
    // Create the menu button
    MenuButton mb = new MenuButton("Stuffs");
    mb.getItems().add(customMenuItem);
    

    还有输出

    注意:hideOnClickProperty设置为true很重要,避免用户点击树时关闭,这甚至可以在构造函数中完成,这样你就可以缩短初始化为:

    CustomMenuItem customMenuItem = new CustomMenuItem(tree, false);
    

    如果要移除悬停发光,可以添加以下 CSS 类:

    .menu-item {
        -fx-padding: 0;
    }
    

    【讨论】:

    • 太棒了。我只需要设置按钮的上下文菜单的样式,以摆脱奇怪的悬停发光,我猜。
    • 为你更新了关于悬停发光的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多