获取 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(这是一个真正的问题);但在他们修复错误之前,这是我能提出的最好建议。我建议你投票给它...
所以我有控制器 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(这是一个真正的问题);但在他们修复错误之前,这是我能提出的最好建议。我建议你投票给它...