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

时间:2016-08-29 11:55:42

标签: java checkbox javafx treeview antialiasing

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

我创建了以下课程,灵感来自这个问题: Java FX8 TreeView in a table cell

makefile_with_prerequisite_variables

我正在使用的树包含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()); } } }); } } 个对象,当弹出窗口工作时,只要焦点不在复选框上,所有复选框上都会出现一些奇怪的模糊。 (见下面的GIF)

CheckBoxTreeItem Blur

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

然后,我看到非整数锚点可能会导致问题。但是DISABLED没有做任何事情,也没有做到以下事情:

popup.setAutoFix(true)

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

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

1 个答案:

答案 0 :(得分:3)

我建议使用内置控件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);

输出

enter image description here

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

CustomMenuItem customMenuItem = new CustomMenuItem(tree, false);

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

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