5

アプリケーション全体で使用されるアイコンがいくつかあります。例として、OK/キャンセル アイコンを見てみましょう。現時点では、それらはティックとクロス (tick.png、cross.png) である可能性がありますが、将来的にはそれらを置き換えたいと思うかもしれません。また、リソース パスを 1 か所にまとめたいと考えています。

これでよろしいですか:

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

それには2つの問題がありますが、どちらも受け入れられる可能性があります。

  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クラスを検査し、クラス内の各パブリック静的アイコンフィールドのリソースをロードすることです。このように、新しいアイコン定数を宣言するだけで、対応するリソースが定数の名前に基づいて自動的にロードされます。これを行うためのヒントがさらに必要な場合は、コメントを残してください。

于 2008-12-15T19:06:08.033 に答える
0

これは物事を行うための標準的な方法のようですが、私は以前に問題を抱えていました。

MavenでEclipseを使用していて、これらのアイコンをMavenのリソースディレクトリに保存している場合、Eclipseが自動ビルドの1つを実行すると、アイコンファイルはターゲット/クラスディレクトリにコピーされません。これにより、アイコンが見つからない場合にランタイム例外が発生します。

アイコンを適切な場所に配置するには、少なくとも1回は手動でMavenパッケージを実行する必要があります。

于 2008-12-15T19:11:07.510 に答える
0

それはそれを行うかなり簡単な方法のようです。画像には、その名前と同じ名前を付けますが(「ok.png」、「cancel.png」)。また、画像を削除または名前変更すると問題が発生する可能性があることを明確にしてください。

于 2008-12-15T18:58:08.923 に答える