所以我有这个对象的控制器类:
@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并将其设置回原位,没有错误。我只是无法添加新内容。
答案 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之前,我可以提出最好的建议。我建议你投票给它......