如何更改NewProject按钮[Netbeans IDE插件开发]的图标?

时间:2019-05-31 17:50:22

标签: java netbeans netbeans-plugins

我正在编写一个Netbeans IDE插件,该插件应该能够替换工具栏中的某些图标。根据{{​​3}}博客条目的内容,我搜索了特定的操作并编写了合适的类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操作的图标时,旧图标仍然存在并且保持不变! 在比较projectui模块中的NewProject.java和NewFile.java(可正常工作)的源代码之后,我发现了一个奇怪的区别。在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按钮的图标不会改变!

1 个答案:

答案 0 :(得分:0)

您不能更改NewProject操作的图标,因为它的实例是使用 lazy 工厂创建的。默认情况下,除非指定注释参数Actions,否则使用@ActionRegistration创建的所有lazy=false都是以这种方式创建的。

如Javadoc here中所述,惰性实例化是一种仅在调用动作实例(调用actionPerformed()时)才延迟动作实例的创建的机制。目的是限制启动开销。如果UI元素(例如按钮)需要该操作的图标,则使用元数据(例如iconBase注释参数)来提供它。

因此,当您使用action.putValue("iconBase", "iconPath")时,实际上是更改了由注释(源代码here)创建的AlwaysEnabledAction实例的属性,而不是委托动作NewProject的属性。 / p>

正如您所发现的,NewFile操作并不是很懒惰地创建的,这就是更改icon属性起作用的原因。