Почему UIManager.getDefaults().keySet() возвращает значения, отличные от UIManager.getDefaults().keys()?

Я использую код из этого сообщения stackOverflow, который делает то, что я ожидаю:

    Enumeration<Object> keys = UIManager.getDefaults().keys();
    while (keys.hasMoreElements()) {
        Object key = keys.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof FontUIResource) {
            FontUIResource orig = (FontUIResource) value;
            Font font = new Font(orig.getFontName(), orig.getStyle(), orig.getSize());
            UIManager.put(key, new FontUIResource(font));
        }
    }

Я попытался преобразовать его в следующий код, который перебирает только пару классов в javax.swing.plaf вместо полного набора компонентов. Я пробовал копаться в Swing API и HashTable API, но чувствую, что мне все еще не хватает чего-то очевидного.

    for(Object key : UIManager.getDefaults().keySet()){
        Object value = UIManager.get(key);
        if(value instanceof FontUIResource){
            FontUIResource orig = (FontUIResource) value;
            Font font = new Font(orig.getFontName(), orig.getStyle(), orig.getSize());
            UIManager.put(key, new FontUIResource(font));
        }
    }

Любые идеи, почему первый блок кода зацикливается и изменяет все ресурсы шрифта, а второй зацикливается только на нескольких элементах?


person Alex Pritchard    schedule 18.10.2013    source источник
comment
См. также связанные вопросы и ответы.   -  person trashgod    schedule 19.10.2013


Ответы (1)


Это хороший вопрос, ответ на который заключается в том, что используемый вами метод возвращает совершенно разные объекты.

UIManager.getDefaults().keys(); вернуть перечисление. Перечисление не беспокоится о повторяющихся объектах в коллекции для итерации.

UIManager.getDefaults().keySet() Возвращает набор и поэтому не может содержать повторяющиеся объекты. Когда элементы будут вставлены в набор, метод que equals объекта используется для проверки того, что объект уже находится в наборе. Вы ищете объекты вида FontUIResource, и эти объекты имеют следующую реализацию метода os equals:

public boolean equals(Object obj)
    Compares this Font object to the specified Object.
Overrides:
    equals in class Object
Parameters:
    obj - the Object to compare
Returns:
    true if the objects are the same or if the argument is a Font object describing the same font as this object; false otherwise.

Таким образом, на множестве не вставляются все ключи вида FontUIResource с аргументом, описывающим один и тот же шрифт, на множестве вставляется один из них. Следовательно, набор имеет только подмножество ключей на карте.

Дополнительная информация о наборах Java:

http://goo.gl/mfUPzp

person oviwonkenovi    schedule 19.10.2013
comment
Спасибо, @nrodriguez. Я знаком с различиями между Enumerations и Sets, но я не понимал, что FontUIResource определяет равенство таким образом! - person Alex Pritchard; 25.10.2013