获取ContextMenu并添加新项时出错

时间:2015-02-20 00:21:48

标签: contextmenu javafx-8 menuitem

所以我有这个对象的控制器类:

 @FXML
    private TextArea textArea;  

然后我尝试将新的MenuItem添加到其标准项目(即“复制”和“全选”)

 @Override
public void initialize(URL location, ResourceBundle resources) {
        ContextMenu contextMenu = textArea.getContextMenu();
     X  contextMenu.getItems().add(new MenuItem("chuj"));
        textArea.setContextMenu(contextMenu);

和标有X的行获取空指针异常。为什么? 有趣的是,我可以从textArea获取contextMenu并将其设置回原位,没有错误。我只是无法添加新内容。

1 个答案:

答案 0 :(得分:1)

不幸的是,目前没有办法访问默认的上下文菜单,这是TextInputControl中的私有API。这是known bug

如果设置了上下文菜单,它将删除默认菜单。您可以在默认上下文菜单中重新创建大多数功能,因为这些功能只是映射到TextArea中定义的公共方法。例外情况是"撤消"和"重做"。

所以你可以这样做:

private List<MenuItem> createDefaultMenuItems(TextInputControl t) {
    MenuItem cut = new MenuItem("Cut");
    cut.setOnAction(e -> t.cut());
    MenuItem copy = new MenuItem("Copy");
    copy.setOnAction(e -> t.copy());
    MenuItem paste = new MenuItem("Paste");
    paste.setOnAction(e -> t.paste());
    MenuItem delete = new MenuItem("Delete");
    delete.setOnAction(e -> t.deleteText(t.getSelection()));
    MenuItem selectAll = new MenuItem("Select All");
    selectAll.setOnAction(e -> t.selectAll());

    BooleanBinding emptySelection = Bindings.createBooleanBinding(() ->
        t.getSelection().getLength() == 0,
        t.selectionProperty());

    cut.disableProperty().bind(emptySelection);
    copy.disableProperty().bind(emptySelection);
    delete.disableProperty().bind(emptySelection);

    return Arrays.asList(cut, copy, paste, delete, new SeparatorMenuItem(), selectAll);
}

现在你可以做到

public void initialize() {
    ContextMenu contextMenu = new ContextMenu();
    contextMenu.getItems().addAll(createDefaultMenuItems(textArea));
    contextMenu.getItems().add(new MenuItem("chuj"));
    textArea.setContextMenu(contextMenu);
}

这有点像黑客攻击(复制功能等)并且你失去了撤销/重做(这是一个真正的问题);但是在他们修复bug之前,我可以提出最好的建议。我建议你投票给它......