簡體   English   中英

如何使上下文菜單在 javaFX 中的樹視圖上工作?

[英]How to make a context menu work on a treeview in javaFX?

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

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

您必須為每個單元格創建不同的上下文菜單:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM