为什么UIManager.getDefaults()。keySet()返回的值不同于UIManager.getDefaults()。keys()?

时间:2013-10-18 18:31:50

标签: java swing key uimanager

我正在使用this stackOverflow post中的代码,这符合我的期望:

    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));
        }
    }

为什么第一个代码块会循环并更改所有字体资源的任何想法,而第二个代码块只会循环遍历少数几个项目?

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,答案是你正在使用的方法返回完整的不同对象。

UIManager.getDefaults()键();返回枚举。枚举并不担心在集合上复制对象以进行迭代。

UIManager.getDefaults()。keySet()返回一个Set,因此它不能包含重复的对象。当要在set 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