2008-12-15 64 views
5

我在应用程序中使用了许多图标 - 让我们以ok/cancel图标为例。目前他们可能是一个勾号和一个交叉(tick.png,cross.png),但我可能想在将来替换它们。另外,我想将资源路径保存在一个地方。Java图标常量 - 静态常量是否正常?

这是正确的:

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

解决方案

我用特对初始化的想法,我所做的常数最终:

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); 
    } 
} 
+0

确定和取消应该是类型图标,而不是ImageIcon的的。无需将ImageIcon公开为其公共合同的一部分。 – 2008-12-15 19:02:50

+0

好点 - 这就是我快速输入示例所得到的结果!固定 – Draemon 2008-12-15 19:06:13

回答

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); 
} 

这样,只要出现故障,您就可以控制,而且您不必在实例化中重复自己。

此外,我会使常数最终。

较普遍的办法可能是使用反射来检查你的图标类和负载的资源类中的每个公共静态图标字段。这样,您只需要声明一个新的Icon常量,并且相应的资源将根据常量的名称自动加载。留下评论,如果你想要做更多的提示。

+0

我喜欢这个,虽然a)它可能应该返回Icon而不是ImageIcon,b)最好是返回一个空的图标而不是null。 – Draemon 2008-12-15 19:15:45

2

您可能需要将常量标记为final。

+0

和图标类本身? – Draemon 2008-12-15 19:07:43

0

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

3

我看到两个问题是,既可以接受:

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

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

2号可能是可接受的,因为图标通常在整个应用程序的整个运行时,他们会在应用程序退出反正之前不会长久地释放。

因此,所有的一切我会说这很好。

0

这似乎是一个做事的标准方法,但我已经与以前有问题。

如果您使用的是Eclipse使用Maven和存储在Maven的资源目录这些图标,当Eclipse会自动的一个版本,它不会图标文件复制到目标/ classes目录下。这会在找不到图标时导致运行时异常。

您必须手动做行家包至少一次得到在正确的位置的图标。