我想在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;
}
});
你註冊上下文菜單與樹的細胞? –
你的意思是像創建createNode爲每個節點創建一個MenuItem,它是一個派生類,它包含文件名?即單獨的contextMenus每個項目? – Adder
恩,沒有。我真的不明白這個意見。你剛發佈的代碼顯示了你如何構建上下文菜單。你沒有顯示你使用它的地方,也就是說你在某處做某事.setContextMenu(cm);'或'something.setOnContextMenuRequested(event - > cm.show(...));'或類似的東西。如果'something'是相關的樹單元格,您可以從單元格中獲取樹項並執行所需的操作。 (但爲每個* cell單獨的上下文菜單*(不是項目),是的。) –