获取 ContextMenu 和添加新项目时出错

Error when getting ContextMenu and adding new item

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

 @FXML
    private TextArea textArea;  

然后我尝试将新的 MenuItem 添加到其标准项目(即 "copy" 和 "select all")

 @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 并将其设置回原位而不会出现错误。我只是不能添加新的东西。

遗憾的是,目前没有访问默认上下文菜单的方法,该菜单在 TextInputControl 中是私有的 API。这是一个known bug.

如果您设置上下文菜单,它会删除默认菜单。您可以在默认上下文菜单中重新创建大部分功能,因为这些功能仅映射到 TextArea 中定义的 public 方法。例外情况是 "undo" 和 "redo"。

所以你可以这样做:

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

有点乱(复制功能等),你失去了 undo/redo(这是一个真正的问题);但在他们修复错误之前,这是我能提出的最好建议。我建议你投票给它...