首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下拉按钮弹出中的JavaFX CheckBoxTree

下拉按钮弹出中的JavaFX CheckBoxTree
EN

Stack Overflow用户
提问于 2016-08-29 11:55:41
回答 1查看 919关注 0票数 2

为了让最终用户将搜索限制在主TableView的某些列上,我需要一个带复选框的treeview。我决定将这个TreeView嵌入到一个弹出窗口中,显示在自定义按钮上。

我创建了以下类,其灵感来自于这个问题:表单元格中的Java FX8 TreeView

代码语言:javascript
复制
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)没有做任何事情,以下也没有:

代码语言:javascript
复制
popup.setAnchorX(new Double(x).intValue());
popup.setAnchorY(new Double(y).intValue());

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

我怎样才能得到清晰的复选框,不管它们的焦点是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-29 12:21:15

我建议一个内置的控制,CustomMenuItem,而不是重新发明车轮:

一个MenuItem,它允许将一个节点分配给content属性,从而将任意节点嵌入其中。

示例

代码语言:javascript
复制
// 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,以避免用户单击树时关闭,这甚至可以在构造器中完成,因此可以将初始化缩短到:

代码语言:javascript
复制
CustomMenuItem customMenuItem = new CustomMenuItem(tree, false);

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

代码语言:javascript
复制
.menu-item {
    -fx-padding: 0;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39205744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档