2017-04-21 24 views
0

TreeViewアイテムにコンテキストメニューが必要です。 イベントハンドラのActionEventが、どのTreeViewアイテムがクリックされたかについての情報を私に与えてくれると期待していますが、getSourceとgetTargetがMenu Itemを返すだけです。どのTreeViewアイテムがクリックされたかをどのようにして知ることができますか?別のタブに複数のツリービューを持つことができます。javaFXのツリービューでコンテキストメニューを動作させる方法は?

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

私は今cellfactoryを使用しよう:この呼び出し

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

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

は、この呼び出し、しかし、私はpパラメタの使い方を理解していませんrを押して細胞の値を見つけます。このための私のコードは次のとおりです。

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

Umm、いいえ。私はそのコメントを本当に理解していません。あなたが投稿したコードは、コンテキストメニューをどのように構築するかを示しています。あなたは 'something.setContextMenu(cm);や' something.setOnContextMenuRequested(event-> cm.show(...)); 'などのように、どこで使用するのかわかりません。 'something'が関連するツリーセルであれば、セルからツリー項目を取得し、必要な処理を行うことができます。 (しかし、各セル*(項目ではない)のコンテキストメニューを別々にしてください) –

答えて

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

関連する問題