2016-08-29 19 views
2

エンドユーザがメインTableViewのいくつかのカラムに検索を制限するためには、チェックボックス付きのツリービューが必要でした。 このツリービューをポップアップに埋め込み、カスタムボタンをクリックして表示することにしました。ドロップダウンメニューのJavaFX CheckBoxTreeボタン

私は質問からインスピレーションを得た次のクラスを作成している:私が働いている木がCheckBoxTreeItemオブジェクトが含まれており、ポップアップが働いている間、すべてのチェックボックスにいくつかの奇妙なぼかしがある

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()); 
       } 
      } 
     }); 
    } 
} 

Java FX8 TreeView in a table cell

フォーカスがチェックボックスにないときはいつでも。次に、(下記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、内蔵の制御を示唆している:コンテンツプロパティにノードを割り当てることによって、その中に埋め込まれる任意のノード、 を可能

Aメニューアイテムを。

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

注:ときhideOnClickPropertytrueに、閉鎖を避けるために設定することが重要ですあなたはホバー輝きを削除したい場合は、以下のCSSクラスを追加することができます

CustomMenuItem customMenuItem = new CustomMenuItem(tree, false); 

あなたが初期化を短縮することができるようにしても、コンストラクタで行うことができ、ツリー内のユーザーがクリック
.menu-item { 
    -fx-padding: 0; 
} 
+0

ブリリアント。 私はちょうど奇妙なホバーの輝きを取り除くために、ボタンのコンテキストメニューをスタイルする必要があると思います。 – T4GG

+0

ホバーグローについての答えが更新されました。 – DVarga

+0

ありがとうございました! – T4GG

関連する問題