4

在我的 Java 应用程序的首选项中,他们可以将调试级别设置为包含七个默认级别的 JComboBox。该列表包含严重,警告,信息等,这是相当丑陋的,我宁愿用“严重,警告”代替英语。

java logging 使用的 java.util.logging.Level 具有可以采用不同资源包的构造函数,因此我想到了 sublassing 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() 在组合框中为我工作

IE

 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 的示例:How to use Map element as text of a JComboBox

于 2012-08-22T11:26:10.333 回答
1

Level 中的每个日志记录级别都有一个对应的 int。如果您想过滤要记录的事件级别,您可以尝试一些很长的内容,

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

这将只记录警告和严重。

如果您想更改这些级别的值,我想您可以创建自己的 MyLevels 类,其中包含具有您想要的值的 Level 静态实例。

于 2012-08-22T11:38:28.027 回答