4

私のJavaアプリケーションの設定では、7つのデフォルトレベルを含むJComboBoxとして表示されるデバッグレベルを設定できます。リストにはSEVERE、WARNING、INFO eceteraが含まれていますが、これはかなり醜く、Idは英語の「Severe、Warning」に置き換えられます。

javaロギングで使用されるjava.util.logging.Levelには、異なるリソースバンドルを取得できるコンストラクターがあるため、リソースバンドルを自分のものに変更できるように、レベルをサブレーザー化することを考えました。

しかし、変更されたレベルを使用するためにJavaログを取得するにはどうすればよいですか?

編集

以下のkansの回答に示されているサンプルクラスの修正バージョンを使用しました

class LevelItem extends Object
{
    public final Level level;
    public LevelItem(Level level)
    {
        this.level = level;
    }

    public String toString()
    {
        return level.getLocalizedName().substring(0,1)+
               level.getLocalizedName().substring(1).toLowerCase();
    }

    public boolean equals(Object obj) 
    {
        return (obj instanceof LevelItem &&
            (this.level.equals((((LevelItem) obj).level))));
    }
}

ただし、equalsメソッドを追加する必要があるため、コンボボックスでsetSelectedItem()が機能します

すなわち

 debugLevelCombo = new JComboBox();
 debugLevelCombo.addItem(new LevelItem(Level.SEVERE));
 debugLevelCombo.addItem(new LevelItem(Level.WARNING));
 debugLevelCombo.addItem(new LevelItem(Level.INFO));
 debugLevelCombo.addItem(new LevelItem(Level.CONFIG));
 debugLevelCombo.addItem(new LevelItem(Level.FINE));
 debugLevelCombo.addItem(new LevelItem(Level.FINER));
 debugLevelCombo.addItem(new LevelItem(Level.FINEST));
 debugLevelCombo.setSelectedItem(new
      LevelItem(Level.parse(UserPreferences.getInstance().getDebugLevel())));
4

2 に答える 2

4

「java」パッケージ内のクラスは変更しないでください。これはJDKの一部です。そして明らかにそれはGUIのオプションではありません。JComboBoxを使用して値を異なる方法でレンダリングする方法の詳細をご覧ください。たとえば、ラッパークラスを作成できます。

class LevelItem
{
   private final Level level;
   public LevelItem(Level level) {this.level=level;}
   public String toString()
   {
     if(Level.WARNING.equals(level) return "Warning";
     if(Level.INFO.equals(level) return "Information";
...
     }
   }
}

そして、コンボボックスの値に使用します。または、カスタムレンダラーを作成することも可能です。これは、カスタマイズされたrednererを作成する方法の例です。JComboBoxのテキストとしてMap要素を使用する方法

于 2012-08-22T11:26:10.333 に答える
1

Levelの各ロギングレベルには、対応するintがあります。ログに記録するイベントのレベルをフィルタリングする場合は、次のような長い行を試すことができます。

if (event.getLevel().intValue() > Level.INFO.intValue()) {
    event.log();
}

これにより、警告と重大のみがログに記録されます。

これらのレベルの値を変更したい場合は、必要な値を持つLevelの静的インスタンスを含む独自のクラスMyLevelsを作成できると思います。

于 2012-08-22T11:38:28.027 に答える