2017-11-13 51 views
1

내 프로젝트에는 5 개의 열이있는 TreeTableView가 있습니다. 모든 열마다 다른 컨텍스트 메뉴가 필요합니다. 소스 생성기에서 모든 열에 대해 ContextMenu를 만들었지 만 (예 : "값"열에 대해서는 하나만 표시) menù은 열 머리글을 마우스 오른쪽 버튼으로 클릭 할 때만 나타납니다. 그러나 menù는 오른쪽 클릭 만 필요합니다. 셀 값JavaFX TreeTableView 및 ContextMenu

 <TreeTableView fx:id="valueTable" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
    <columns> 
     <TreeTableColumn fx:id="context" prefWidth="483.20001524686813" sortable="false" text="Context" /> 
     <TreeTableColumn fx:id="tag" minWidth="50.0" prefWidth="90.0" sortable="false" text="Tag" /> 
     <TreeTableColumn fx:id="offset" minWidth="50.0" prefWidth="90.0" sortable="false" text="OffSet" /> 
     <TreeTableColumn fx:id="lenght" minWidth="50.0" prefWidth="90.0" sortable="false" text="Lenght" /> 
     <TreeTableColumn fx:id="value" prefWidth="367.99993896484375" sortable="false" text="Value"> 
      <contextMenu> 
       <ContextMenu fx:id="contextMenuValue" > 
       <items> 
        <MenuItem mnemonicParsing="false" text="Action 1" /> 
        <MenuItem mnemonicParsing="false" text="Action 2" /> 
        <MenuItem mnemonicParsing="false" text="Action 3" /> 
        <MenuItem mnemonicParsing="false" text="Action 4" /> 
       </items> 
       </ContextMenu> 
      </contextMenu> 
     </TreeTableColumn> 
    </columns> 
    </TreeTableView> 

나는 확인 MouseClick과 이벤트에 대한 코드를 추가하려고 노력하지만, 이벤트는 TreeTableView "valueTable"에하지 "값"TreeTableColumn에 차단한다.

 value.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> { 
       System.out.println("Work Cell"); 
     }); 
     valueTable.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> { 
      System.out.println("Work Table"); 
     }); 

도와 주시겠습니까? 당신이 동일한 두 번째 열에 대해 다른 메뉴를 설정할 수 있습니다 물론

public class Controller implements Initializable { 

    @FXML 
    private TreeTableView<MyModel> table; 
    @FXML 
    private TreeTableColumn<MyModel, String> first; 
    @FXML 
    private TreeTableColumn<MyModel, Boolean> second; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     first.setCellValueFactory(data -> data.getValue().getValue().nameProperty()); 
     first.setCellFactory(cell -> new MyCell()); 
     second.setCellValueFactory(data -> data.getValue().getValue().selectedProperty()); 

     MyModel john = new MyModel("John"); 
     MyModel andrew = new MyModel("Andrew"); 

     table.setRoot(new TreeItem<>()); 
     table.setShowRoot(false); 
     table.getRoot().getChildren().add(new TreeItem<>(john)); 
     table.getRoot().getChildren().add(new TreeItem<>(andrew)); 

    } 

    private class MyModel { 

     private StringProperty name; 
     private BooleanProperty selected; 

     MyModel(String name) { 
      this.name = new SimpleStringProperty(name); 
      this.selected = new SimpleBooleanProperty(false); 
     } 

     StringProperty nameProperty() { 
      return name; 
     } 

     BooleanProperty selectedProperty() { 
      return selected; 
     } 
    } 

    private class MyMenu extends ContextMenu { 
     MyMenu() { 
      getItems().add(new MenuItem("Test")); 
      getItems().add(new MenuItem("Item")); 

     } 
    } 

    private class MyCell extends TreeTableCell<MyModel, String> { 
     MyCell() { 
      // Here you can set the same menu for each cell. Then the column is having the same cell for every row 
      setContextMenu(new MyMenu()); 
     } 

     // Overridden just to show the text of the cell. 
     @Override 
     protected void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      if (empty) { 
       setText(null); 
      } else { 
       contextMenuProperty().bind(Bindings 
        // here you can define your own condition 
        .when(getTreeTableRow().getTreeItem().getValue().selectedProperty()) 
        .then(new MyMenu()) 
        .otherwise((MyMenu) null)); 
       setText(item); 
      } 
     } 
    } 

} 

는 설정 :

답변

2

대신 열처럼의 셀에 ContextMenu를 추가 한 후 사용자 정의 TreeTableCell를 구현하여 그것을 할 수 있습니다 첫 번째 것.

+0

으로 해결 한 : 메뉴 아이템 – kleopatra

+0

을 추가하여 "기능을 추가하지 않고 확장하지 않는다"==의 ContextMenu의 하위 필요가 대신를 구성하지 예 ' 맞아, 나는 그가 커스터마이징을 원한다면 그냥 확장했다. 그러나 내가 언급했듯이, 내가했던 것처럼이 방법을 사용한다면 확장하는 것은 쓸모 없다. – Sunflame

+0

고마워, 일. 그러나 질문 : TreeItem에서 마우스 클릭을 차단하는 방법은 무엇입니까? 셀 값을 기준으로 메뉴 항목을 사용/사용하지 않도록 설정해야합니다. – SirLancillotto

0

내가 문제/솔루션과 관련이없는

  value.setCellFactory(tc -> { 
      TreeTableCell<MyModel, String> cell = new TreeTableCell<MyModel, String>() { 
       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty) ; 
        setText(empty ? null : item); 
       } 
      }; 
      cell.setOnMouseClicked(e -> { 
       if (! cell.isEmpty()) { 
        String userId = cell.getItem(); 
        System.out.println("Work!"); 
       } 
      }); 
      return cell ; 
     });