Платформа NetBeans: действие отключено, но ярлык активен

После месяца работы над моим приложением я обнаружил кое-что необычное. У меня есть модуль Viewer, в котором находятся все TopComponents, и модуль MenuToolbar, в котором я храню все действия на панели инструментов. Вот мое дополнение:

package com.demo.toolbar;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.openide.awt.ActionRegistration;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionID;
import org.openide.util.NbBundle.Messages;

@ActionID(category = "Edit",
id = "com.demo.toolbar.AddAction")
@ActionRegistration(iconBase = "com/demo/toolbar/icons/add.png",
displayName = "#CTL_AddAction")
@ActionReferences({
    @ActionReference(path = "Toolbars/AddEditDelete", position = 1),
    @ActionReference(path = "Shortcuts", name = "D-A")
})
@Messages("CTL_AddAction=Add")
public final class AddAction implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        //code here
    }
}

Этот ярлык активируется через CTRL+A и переводит TopComponent в режим добавления. У меня также есть DeleteAction, который активируется командой CTRL+D. Когда человек нажимает CTRL+A, происходит следующее:

List<Component> c = new ArrayList<Component>();
        c.addAll(Arrays.asList(ToolbarPool.getDefault().findToolbar("AddEditDelete").getComponents()));
if (mode.equals("add")) {
    for (Component component : c) {
        component.setEnabled(false);
        }
        c.get(13).setEnabled(true);
        c.get(14).setEnabled(true);
}

Таким образом, когда пользователь нажимает кнопку «Добавить» на панели инструментов, он отключает все остальные кнопки (включая «Удалить»), поэтому пользователи не могут выполнять эти действия в режиме «Добавить».

Однако они все еще могут нажать CTRL+D для удаления. Что является большим нет-нет...

Как я могу исправить это поведение?


person Metal Wing    schedule 11.06.2012    source источник


Ответы (1)


Вы не должны включать/отключать действия напрямую. Взгляните на API действий. CookieAction может быть тем, что вы хотите. Идея состоит в том, чтобы опубликовать файл cookie (некоторый контекст) для глобального поиска. Ваши действия, связанные с использованием файлов cookie, автоматически включаются/отключаются в зависимости от наличия файлов cookie.

На самом деле так работает кнопка сохранения в IDE. Всякий раз, когда редактор помещает SaveCookie в глобальный контекст, активируются кнопка панели инструментов и Ctrl+S; как описано здесь

Вы можете рассмотреть возможность использования конечного автомата, чтобы четко контролировать наличие файлов cookie.

person Alexander    schedule 24.06.2012
comment
Я попытался, и примерно через неделю я все еще не смог придумать даже удаленно работающий прототип. Моя цель состоит в том, чтобы иметь Action1, Action2 и Action3 (все настраиваемые действия, созданные с помощью мастера NB), где нажатие Action1 отключит действие1 и действие2, а нажатие Action3 активирует 1 и 2, но отключит 3. Если у вас есть ссылка на сортировку учебника, который показывает реализацию CookieAction более подробно, чем API, я был бы очень признателен. Я согласен с тем, что использование какого-либо глобального контекста лучше, чем прямое управление действиями. - person Metal Wing; 25.06.2012