Удаление узлов в проводнике, а не в TopComponent - PullRequest
0 голосов
/ 24 августа 2018

Я использую представление проводника (OutlineView) внутри диалога, созданного из DialogDescriptor. Ниже приведена урезанная версия моего кода:

@ActionID(category = "Example", id = "org.example.Test")
@ActionRegistration(displayName = "Test")
@ActionReference(path = "Menu/File", position = 0)
public class SomeAction implements ActionListener {

  @Override
  public void actionPerformed(ActionEvent e) {
    DialogDescriptor dd = new DialogDescriptor(new MyPanel(), "Titel", true, null);
    DialogDisplayer.getDefault().notify(dd);
  }
}

class MyPanel extends JPanel implements ExplorerManager.Provider {
  private final ExplorerManager em;

  public MyPanel() {
    em = new ExplorerManager();
    em.setRootContext(new MyNode());
    add(new OutlineView());
  }

  @Override
  public ExplorerManager getExplorerManager() {
    return em;
  }
}

class MyNode extends AbstractNode {
  public MyNode() { super(Children.LEAF); }

  @Override
  public Action[] getActions(boolean context) {
    return new Action[] { SystemAction.get(DeleteAction.class) };
  }

  @Override
  public boolean canDestroy() {
    return true;
  }

  @Override
  public void destroy() {
    // Never called
  }
}

Когда вызывается действие, отображается диалоговое окно, и в виде структуры отображается корневой узел. Однако выбор Удалить из контекстного меню узла открывает диалоговое окно подтверждения для удаления того, что было выбрано в активном TopComponent за модальным диалоговым окном. Как заставить системное действие Удалить рассмотреть выбор в диалоговом окне? Я думаю, что мне нужно что-то похожее на это

ActionMap map = getActionMap();
map.put("delete", ExplorerUtils.actionDelete(em, true));
associateLookup(ExplorerUptils.createLookup(em, map));

взято из TopComponent, но не могу понять, что идет не так. Таким образом, любые указатели очень ценятся.

1 Ответ

0 голосов
/ 06 сентября 2018

В конструкторе MyPanel вы должны добавить действие удаления к карте действий в виде структуры:

OutlineView outlineView = new OutlineView();
DeleteAction delAction = SystemAction.get(DeleteAction.class);

outlineView.getOutline().getActionMap().put(delAction.getActionMapKey(), ExplorerUtils.actionDelete(em,true));

Если вы также хотите активировать клавишу Delete, вы должны поставить тот же ключ карты действий на карту ввода вида контура:

KeyStroke delKey = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
outlineView.getOutline().getInputMap().put(delKey, delAction.getActionMapKey());
...