Я пишу плагин IDE Netbeans, который должен заменить некоторые значки на панели инструментов. Согласно этой записи в блоге, я искал конкретные действия и написал соответствующий класс IconReplacer, который отлично работает:
import org.openide.filesystems.FileUtil;
import org.openide.windows.OnShowing;
import javax.swing.*;
@OnShowing
public class IconReplacer implements Runnable{
public static final String ICON_DIR = "com/geometror/iconreplacer/icons/";
@Override
public void run() {
replaceIcon("Actions/Project/org-netbeans-modules-project-ui-NewFile.instance",
"newFile");
}
private void replaceIcon(String configObj, String iconName){
Action newFileAction =
FileUtil.getConfigObject(configObj, Action.class);
newFileAction.putValue("iconBase", ICON_DIR + iconName + ".png");
newFileAction.putValue("PreferredIconSize", 24);
}
}
Однако, когда я пытаюсь заменить значок действия NewProject, старый значок сохраняется и остается неизменным!
После сравнения исходного кода NewProject.java и NewFile.java (который работает) в модуле projectui я обнаружил одну странную разницу. В NewProject.java Акция зарегистрирована с дополнительными аннотациями:
@ActionID(id = "org.netbeans.modules.project.ui.NewProject", category = "Project")
@ActionRegistration(displayName = "#LBL_NewProjectAction_Name", iconBase = "org/netbeans/modules/project/ui/resources/newProject.png")
@ActionReferences({
@ActionReference(path = "Shortcuts", name = "DS-N"),
@ActionReference(path = ProjectsRootNode.ACTIONS_FOLDER, position = 100),
@ActionReference(path = "Menu/File", position = 100),
@ActionReference(path = "Toolbars/File", position = 200)
})
Эти аннотации отсутствуют в NewFile.java. Там свойство baseIcon установлено как
putValue("iconBase","org/netbeans/modules/project/ui/resources/newFile.png"); //NOI18N
Хотя эти два варианта должны выполнять одно и то же, значок кнопки NewProject не меняется!