のインスタンスのようなSwingオブジェクトの固定セットを作成するアプリケーションが必要です。また、それぞれ、Font
とのようColor
に、明確に定義された/中央/アプリケーション全体の場所にGuiFonts.java
ありGuiColors.java
ます。
このようにして、アプリケーションは次のようなものを参照できます。GuiFonts.SMALL_FONT
またGuiColors.BACKGROUND
、後で「小さいフォント」が10ポイントではなく8ポイントを意味する、または背景が#FFEF88
、ではなく、で#AAAAFFF
あると判断した場合は、1か所で変更を加えることができます。例えば。
では、これらのデフォルトをどのように書くべきですか?特に、Swing Event Dispatch Thread(EDT)の可視性に関して正しく初期化されるようにするには、どのように記述すればよいですか?
Swing GUIオブジェクトをEDTで作成し、参照するのは正しいと思いますが、EDTでのみです-はい?
それで、このようなもので十分でしょうか、それともコードがEDTではなくクラスローダースレッドで実行されるため、どういうわけか不十分でしょうか?または、参照が存在する限り、非EDTスレッドで実行するだけで十分static final
ですか?
import java.awt.Font;
public class GuiFonts {
// not running on EDT, but is it correct anyhow?
public static final Font = new Font(Font.SANS_SERIF, Font.PLAIN, 16);
}
または、おそらく次のように、オブジェクトがEDTで作成されていることを確認する必要があります。
import java.awt.*;
import java.util.concurrent.*;
import javax.swing.*;
public class GuiFonts {
// intended to run on EDT, but is EDT running yet? In all cases?
public static final Font MEDIUM_FONT = new Callable<Font>() {
@Override
public Font call() {
final RunnableFuture<Font> future = new FutureTask<Font>(new Callable<Font>() {
@Override
public Font call() {
return new Font(Font.SANS_SERIF, Font.PLAIN, 16);
}
});
try {
SwingUtilities.invokeAndWait(future); // Could be invokeLater() because of the Future...
return future.get();
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
}.call();
}
Callable
確かに、これは冗長ですが、その多くは、を受け入れてEDTに送信するルーチンにパッケージ化できます。
public static final Font MEDIUM_FONT = runOnEDT(new Callable<Font>() {
@Override
public Font call() {
return new Font(Font.SANS_SERIF, Font.PLAIN, 16);
}
});
Swing EDTの公開の問題に加えて、定数が複数のファイルで相互に参照している場合、このアプローチにはエラーが発生しやすい初期化順序の側面があります。で初期化されていない定数はnull
。
このようなルーチンrunOnEDT
は、すべての例外をキャッチしてログに記録する必要があることに注意してください。特に、ログはcatch
句で 発生し、一部では発生しないUncaughtExceptionHandler
必要があります。これUncaughtExceptionHandler
は、通常、がEDTにすでにインストールされているためです。
または、static
初期化をすべて一緒に中止することが望ましいです。オブジェクトが定数で表される遅延読み込みスキームを支持し、enum
一部のアクセサーは最初の参照時にSwing EDTでGUIオブジェクトを作成しますか?