2017-04-21 49 views
0

我想在TreeView項目上有一個上下文菜單。 我期待事件處理程序的ActionEvent爲我提供有關哪個TreeView項目被點擊的信息,但我只是發現getSource和getTarget返回一個菜單項。我怎樣才能找出哪個TreeView項目被點擊?我可以在單獨的選項卡中有多個treevIews。如何使上下文菜單在javaFX中的樹視圖上工作?

FileContextMenu cm = new FileContextMenu(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent e) { 
      System.out.println("Open File"); 
      //MenuItem mi = (MenuItem)e.getSource(); 
      EventTarget et = e.getTarget(); 
      //File editorFile = new File(mi.getId()); 
      System.out.println(et); 
      //mainWindowController.openEditor(editorFile); 
     } 
    }, new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent e) { 
      System.out.println("Create Project From Template"); 
     } 
    }); 

調用該:

public class FileContextMenu extends ContextMenu 
    { 

      public FileContextMenu(EventHandler<ActionEvent> ehOpenFile, 

EventHandler<ActionEvent> ehProjectFromTemplate) 
     { 
      MenuItem item1 = new MenuItem("Open File"); 
      item1.setOnAction(ehOpenFile); 
      MenuItem item2 = new MenuItem("Create Project From Template"); 
      item2.setOnAction(ehProjectFromTemplate); 
      this.getItems().addAll(item1, item2);  
     } 
    } 

我附上這裏的菜單:

private void addFilesTab(FXMLLoader loader, String sRoot, ContextMenu cm) throws IOException 
{ 
    AnchorPane fileView = loader.load(); 
    FileViewController fileViewController = loader.getController(); 

    FileShort fsRoot = new FileShort(sRoot); 
    if(fsRoot.exists()) { 
     fileViewController.setRootFolder(fsRoot); 
     fileViewController.setContextMenu(cm); 
     ObservableList<Tab> tabs = navigationTabPane.getTabs(); 
     tabs.add(new Tab(sRoot)); 
     // Connect the FileView with last tab of the Navigation TabPane. 
     tabs.get(tabs.size()-1).setContent(fileView); 
    } 
} 

調用該:

public void setContextMenu(ContextMenu cm) 
{ 
    fileTreeView.setContextMenu(cm); 
} 

我現在嘗試使用cellfactory ,但我不明白如何使用p參數找到一個單元格值。我對這個代碼是:

this.fileTreeView.setCellFactory(new Callback<TreeView<FileShort>,TreeCell<FileShort>>(){ 
    @Override 
    public TreeCell<FileShort> call(TreeView<FileShort> p) { 
     TreeCell<FileShort> cell = new TreeCell<FileShort>(); 
     cell.setContextMenu(cm); 
     return cell; 
    } 
}); 
+0

你註冊上下文菜單與樹的細胞? –

+0

你的意思是像創建createNode爲每個節點創建一個MenuItem,它是一個派生類,它包含文件名?即單獨的contextMenus每個項目? – Adder

+0

恩,沒有。我真的不明白這個意見。你剛發佈的代碼顯示了你如何構建上下文菜單。你沒有顯示你使用它的地方,也就是說你在某處做某事.setContextMenu(cm);'或'something.setOnContextMenuRequested(event - > cm.show(...));'或類似的東西。如果'something'是相關的樹單元格,您可以從單元格中獲取樹項並執行所需的操作。 (但爲每個* cell單獨的上下文菜單*(不是項目),是的。) –

回答

1

你必須創建每個小區的不同的上下文菜單:

this.fileTreeView.setCellFactory(new Callback<TreeView<FileShort>,TreeCell<FileShort>>(){ 
    @Override 
    public TreeCell<FileShort> call(TreeView<FileShort> p) { 
     TreeCell<FileShort> cell = new TreeCell<FileShort>() { 
      @Override 
      protected void updateItem(FileShort file, boolean empty) { 
       super.updateItem(file, empty); 
       if (empty) { 
        setText(null); 
       } else { 
        // maybe use a more appropriate string for display here 
        // e.g. if you were using a regular java.io.File you would 
        // likely want file.getName() 
        setText(file.toString()); 
       } 
      } 
     }; 
     ContextMenu cm = createContextMenu(cell); 
     cell.setContextMenu(cm); 
     return cell; 
    } 
}); 

private ContextMenu createContextMenu(TreeCell<FileShort> cell) { 
    ContextMenu cm = new ContextMenu(); 
    MenuItem openItem = new MenuItem("Open File"); 
    openItem.setOnAction(event -> { 
     FileShort file = cell.getItem(); 
     if (file != null) { 
      // open the file... 
     } 
    }); 
    cm.getItems().add(openItem); 
    // other menu items... 
    return cm ; 
} 
+0

謝謝,這看起來像可以工作。但是我有一個問題:樹中的所有項目顯示爲空白,即我只看到沒有文件名和目錄名稱的箭頭。 – Adder

+0

@Adder聽起來像你沒有重寫'updateItem(...)'方法。 (爲了簡潔起見,我認爲你只是從代碼中省略了代碼)。爲答案增加了一個示例實現。 –

+1

在'return cm;'之前缺少'cm.getItems()。addAll(openItem);' – Adder

相關問題