首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX TreeTableView和ContextMenu

JavaFX TreeTableView和ContextMenu
EN

Stack Overflow用户
提问于 2017-11-13 22:11:58
回答 2查看 710关注 0票数 1

在我的项目中,我有一个包含5列的TreeTableView。我需要为每个列不同的上下文菜单。我已经在源代码生成器中为每一列创建了一个ContextMenu (在本例中,您只会看到一个" value“列的值),但是只有右键单击列标题时才会出现men,但我需要men仅在右击单元格值时出现

代码语言:javascript
复制
      <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”TreeTableColumn“上被截获。

代码语言:javascript
复制
        value.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
                System.out.println("Work Cell");
        });
        valueTable.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
            System.out.println("Work Table");
        });

你能帮帮我吗?请注意。

EN

回答 2

Stack Overflow用户

发布于 2017-11-13 23:22:48

您可以实现自定义TreeTableCell,然后将ContextMenu添加到单元格中,而不是列中,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-11-15 19:01:07

我已经解决了

代码语言:javascript
复制
            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 ;
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47266304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档