5

我在整个应用程序中使用了许多图标 - 让我们以确定/取消图标为例。目前它们可能是一个勾号和一个十字(tick.png,cross.png),但我将来可能想替换它们。另外,我想将资源路径保留在一个地方。

这个可以吗:

public class Icons {
    public static Icon OK = new ImageIcon(Icons.class.getResource("/icons/tick.png");
    public static Icon CANCEL = new ImageIcon(Icons.class.getResource("/icons/cross.png");
}

还是我应该以不同的方式做这件事?我不介意在运行时依赖图像文件的存在,因为它们在 .jar 中

解决方案

我已经使用 Bent 的想法进行初始化,并且我已经将常量设为 final:

public final class Icons {
    private static final Logger logger = Logger.getLogger(Icons.class);

    public static final Icon OK = icon("/icons/add.png");
    public static final Icon CANCEL = icon("/icons/cancel.png");

    private static Icon icon(String path) {
        URL resource = Icons.class.getResource(path);
        if(resource==null) {
            logger.error("Resource "+path+" does not exist");
            return new ImageIcon();
        }
        return new ImageIcon(resource);
    }
}
4

5 回答 5

3

我看到两个问题,两者都可以接受:

  1. 如果找不到或由于某些原因无法加载图标,将很难调试。在静态初始化程序中运行的代码可能很棘手,因为很容易“释放”异常。
  2. 该类可能永远不会被卸载,因此图标使用的资源永远不会被释放。

如果您可以确保图标始终存在并且甚至可以通过将初始化放在静态初始化程序块中并添加良好的异常处理和日志记录来解决,那么数字 1 可能是可以接受的。

数字 2 可能是可以接受的,因为图标通常会在应用程序的整个运行时使用,并且在应用程序退出之前它们不会被释放很长时间。

所以总而言之,我会说这很好。

于 2008-12-15T19:00:00.120 回答
2

您可能希望将常量标记为 final。

于 2008-12-15T18:57:12.670 回答
1

如果您想将图标保留为静态常量,我会将 ImageIcon 对象的实例化提取到静态方法中;

public static final Icon ok = icon("ok.png");


private static Icon icon(String path) {

    URL resource = Icons.class.getResource("/icons/" + path);
    if (resource == null) {
        // Log something...
        return null;
    }
    return new ImageIcon(resource);
}

这样,无论何时发生故障,您都可以进行控制,并且您不必在实例化中重复自己。

另外,我会将常量设为最终值。

更通用的方法可能是使用反射来检查您的 Icons 类并为类中的每个公共静态 Icon 字段加载资源。这样,您只需要声明一个新的 Icon 常量,相应的资源就会根据常量的名称自动加载。如果您想获得更多关于此操作的提示,请发表评论。

于 2008-12-15T19:06:08.033 回答
0

这似乎是一种相当简单的方法。虽然我会用与它们的名称相同的名称来命名图像(“ok.png”,“cancel.png”)。并确保清楚删除或重命名图像可能会导致问题。

于 2008-12-15T18:58:08.923 回答
0

这似乎是做事的标准方式,但我以前遇到过问题。

如果您将 Eclipse 与 Maven 一起使用并将这些图标存储在 Maven 的资源目录中,那么当 Eclipse 执行其自动构建之一时,它不会将图标文件复制到您的目标/类目录中。当找不到图标时,这将导致运行时异常。

您必须至少手动执行一次 maven 包才能将图标放在正确的位置。

于 2008-12-15T19:11:07.510 回答