gpt4 book ai didi

java - 为什么 UIManager.getDefaults().keySet() 返回的值与 UIManager.getDefaults().keys() 不同?

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:48 26 4
gpt4 key购买 nike

我正在使用 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));
}
}

知道为什么第一段代码循环并更改所有字体资源,而第二段代码只循环少数项目吗?

最佳答案

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

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 类型的所有键都没有插入到集合中,其中一个被插入。因此,该集合只有 map 上键的一个子集。

有关 java 集的更多信息:

http://goo.gl/mfUPzp

关于java - 为什么 UIManager.getDefaults().keySet() 返回的值与 UIManager.getDefaults().keys() 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com