2015-01-07 72 views
0

我想擁有一個TreeView,它的所有子節點都會永久展開,並且我不希望用戶能夠展開或摺疊任何兒童。JavaFX TreeView:刪除展開/摺疊按鈕(公開節點)和功能

要做到這一點,我發現,我需要做到以下幾點:用CSS

即使該圖標不再可見,仍然可以點擊。我沒有看到任何過濾這種方式;我只能看到能夠在事後迴應它的方法。

此外,如果我缺少其他需要確保此功能的其他信息,請告訴我。

+0

別樹項目帶任何功能(即可以點擊他們,用一些自定義操作)? –

+0

是;我實現了一個自定義TreeCell並將其設置爲我的細胞工廠。我並不關心是否能夠開始/取消/提交編輯,因爲每個TreeCell的圖形都是帶有各種組合框和其他控件的FlowPane,用於顯示單元格的各種基礎模型。 我仍然希望他們能夠點擊,突出顯示並拖動。 – Nathan

+0

是否有任何方法可以用CSS去除摺疊按鈕的整個擊中階段?我甚至在這一點上解決了這個問題...... – Nathan

回答

4

我覺得挺傻的。我認爲這主要是一個不知道該被稱爲箭的問題。顯然它是一個披露節點?也許這是常識。

在自定義的TreeCell,我所做的就是加入這一行中的updateItem方法:

setDisclosureNode(null); 
+0

嗨..這將有點幫助,如果你解釋你如何定義自定義treeCell – theBeacon

1

如果我們在發送點擊前捕獲點擊並使用正確的點擊,則避免修改皮膚或默認行爲的解決方案更爲簡單。

爲此,我們可以使用一個EventDispatcher,過濾既按下鼠標及以上的箭頭,這是StackPane節點右鍵:

class CellEventDispatcher implements EventDispatcher { 

    private final EventDispatcher original; 

    public CellEventDispatcher(EventDispatcher original) { 
     this.original = original; 
    } 

    @Override 
    public Event dispatchEvent(Event event, EventDispatchChain tail) { 
     if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED) || 
      event.getEventType().equals(ContextMenuEvent.ANY)){ 
      event.consume(); 
     } 
     if(event instanceof KeyEvent && event.getEventType().equals(KeyEvent.KEY_PRESSED)){ 
      if((((KeyEvent)event).getCode().equals(KeyCode.LEFT) || 
       ((KeyEvent)event).getCode().equals(KeyCode.RIGHT))){ 
       event.consume(); 
      } 
     } 
     return original.dispatchEvent(event, tail); 
    } 
} 

現在,我們運用我們的自定義調度樹視圖:

@Override 
public void start(Stage primaryStage) { 
    TreeView<String> tree = new TreeView<>(); 
    ... 
    EventDispatcher treeOriginal = tree.getEventDispatcher(); 
    tree.setEventDispatcher(new CellEventDispatcher(treeOriginal)); 

    Scene scene = new Scene(tree); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

這將消耗樹上箭頭上的任何點擊(左或右)。

EDIT

添加到事件調度器類在用戶使用鍵盤來遍歷樹視圖,消耗崩潰的情況下/擴大與箭頭LEFTRIGHT事件。

+0

這不會創建一個場景,如果披露節點(小箭頭)仍然存在(儘管可能在我的情況下不可見),用戶將點擊不可見按鈕,並且在沒有選擇TreeItem的情況下消耗鼠標點擊事件? – Nathan

+0

嗯,你可以做的只是觸發這個treeItem的動作(你必須找到哪個項目被點擊,雖然) –

+0

剛剛添加到事件分派器類的情況下,用戶使用鍵盤遍歷樹視圖,用箭頭「LEFT」或「RIGHT」消耗摺疊/展開事件。 –