下拉按钮弹出窗口中的 JavaFX CheckBoxTree

标签 java checkbox javafx treeview antialiasing

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

受这个问题的启发,我创建了以下类(class): 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)

CheckBoxTreeItem Blur

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

然后,我发现非整数 anchor 可能会导致问题。但是 popup.setAutoFix(true) 没有执行任何操作,也没有执行以下操作:

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

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

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

最佳答案

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

A MenuItem that allows for arbitrary nodes to be embedded within it, by assigning a Node to the content property.

示例

// 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);

和输出

enter image description here

注意:设置 hideOnClickProperty 非常重要。设置为 true,以避免用户在树中单击时关闭,这甚至可以在构造函数中完成,因此您可以将初始化缩短为:

CustomMenuItem customMenuItem = new CustomMenuItem(tree, false);

如果您想删除悬停发光,您可以添加以下 CSS 类:

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

关于下拉按钮弹出窗口中的 JavaFX CheckBoxTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205744/

相关文章:

css - 选中时无法更改 Font Awesome 图标颜色 - 复选框

java - 如何为 "drawer"菜单制作自动调整大小的边框 Pane

JavaFX 播放 mp3

JavaFX 或 FXML。有什么不同?

java - Flying Saucer 不会在 PDF 中渲染 PNG 文件

java - 消费者在重新启动之前无法从新创建的分区进行轮询

java - 网页中使用相同类名的多个元素时的 jQuery DatePicker 问题

java - guice AbstractModule 安装方法

html - jQuery Mobile 复选框字段集(数据类型-水平)图标错误(未隐藏?)

javascript - 使用 javascript/jquery 进行复选框操作