내 프로젝트에는 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);
}
}
}
}
는 설정 :
으로 해결 한 : 메뉴 아이템 – kleopatra
을 추가하여 "기능을 추가하지 않고 확장하지 않는다"==의 ContextMenu의 하위 필요가 대신를 구성하지 예 ' 맞아, 나는 그가 커스터마이징을 원한다면 그냥 확장했다. 그러나 내가 언급했듯이, 내가했던 것처럼이 방법을 사용한다면 확장하는 것은 쓸모 없다. – Sunflame
고마워, 일. 그러나 질문 : TreeItem에서 마우스 클릭을 차단하는 방법은 무엇입니까? 셀 값을 기준으로 메뉴 항목을 사용/사용하지 않도록 설정해야합니다. – SirLancillotto