1

のインスタンスのような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オブジェクトを作成しますか?

4

2 に答える 2

1

Swingには、 UIManagerというもののための「明確に定義された/中央/アプリケーション全体の場所」がすでにあります。

これを使用する利点は、フォントや色などがSwingによって自動的に設定されるため、設定する必要がないことです。

こちらもご覧ください:Swingプログラムのデフォルトフォントの設定

編集:Swingコンポーネントを作成する必要がある場合は、EDTで作成する必要があります。一部の古いドキュメントでは、コンポーネントがまだ「実現」されていない場合は他のスレッドでコンポーネントを作成しても安全であると記載されていますが、これは時代遅れのアドバイスであることに注意してください。

于 2013-01-22T20:51:49.930 に答える
1

フォントと色は、Swing ではなく AWT の一部です。

そうは言っても、私はあなたがフォントで概説したことをしました。

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 で使用する限り、問題ありません。EDT でメソッド コードを実行しています。

Font コードをメソッドに入れることができます。

public static Font getNormalFont() {
    return new Font(Font.SANS_SERIF, Font.PLAIN, 12);
}

このようにして、EDT から呼び出されたときにコードが EDT で実行されていることを確認します。

于 2013-01-22T20:38:31.517 に答える