2016-08-29 2 views
2

Чтобы конечный пользователь мог сдержать поиск по некоторым столбцам основного TableView, мне понадобилось дерево с флажками. Я решил внедрить этот TreeView в всплывающее окно, показывая по щелчку на пользовательской кнопке.JavaFX CheckBoxTree при всплывающем раскрывающемся списке Button

Я создал следующий класс, вдохновленный от вопроса: 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

Тогда я увидел, что не целочисленные точки привязки может вызвать проблемы. Однако popup.setAutoFix(true) ничего не делал, и не сделал следующее:

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

Может быть, стоит отметить, что я работаю с FXML.

Как я могу получить острые флажки независимо от их фокуса?

ответ

3

Я хотел бы предложить встроенный контроль, CustomMenuItem, а не изобретать колесо:

Пункт в меню, который позволяет для произвольных узлов для встраивания в него, путем присвоения узла к свойству контента.

Пример

// 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; 
} 
+0

Блестящий. Мне просто нужно стилизовать контекстное меню кнопки, чтобы избавиться от странного зависания. – T4GG

+0

Обновлен ответ для вас о свечении наведения. – DVarga

+0

Большое спасибо! – T4GG

Смежные вопросы