我正在尝试根据用户的配置文件在运行时更改一些UI属性、字体、颜色等。
javax.swing.UIManager.getDefaults().keySet()返回的Set对象报告的size()为零,即使UIDefaults对象报告的大小不为零,其entrySet()也是如此。
正如预期的那样,使用javax.swing.UIManager.getLookAndFeelDefaults()为所有三个对象报告相同的非零大小。
package test;
import java.util.Map;
import java.util.Set;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
public class TestUIManager {
public static void main(String[] args) {
UIDefaults uidef = UIManager.getDefaults();
System.out.println("UIManager.getDefaults()");
testUIDefaults(uidef);
uidef = UIManager.getLookAndFeelDefaults();
System.out.println("UIManager.getLookAndFeelDefaults()");
testUIDefaults(uidef);
}
private static void testUIDefaults(UIDefaults uidef) {
Set<Object> keySet = uidef.keySet();
Set<Map.Entry<Object, Object>> entrySet = uidef.entrySet();
System.out.println(" uidef.size = " + uidef.size() +
" : keySet.size = " + keySet.size() +
" : entrySet.size = " + entrySet.size());
}
}在我的Ubuntu系统上,这段代码的输出是:
UIManager.getDefaults()
uidef.size = 641 : keySet.size = 0 : entrySet.size = 641
UIManager.getLookAndFeelDefaults()
uidef.size = 641 : keySet.size = 641 : entrySet.size = 641非空的哈希表(UIDefaults)怎么会有一个空的keySet呢?
注意:我问这个主要是为了满足我自己的好奇心。使用getLookAndFeelDefaults()似乎可以得到我想要的结果。
发布于 2020-06-08 21:20:41
将此代码插入到函数中:
System.out.println("uidef.getClass()="+uidef.getClass());这表明UIManager.getDefaults()返回一个javax.swing.MultiUIDefaults
class MultiUIDefaults extends UIDefaultsMultiUIDefaults覆盖entrySet / get和其他调用,这会影响entrySet与keySet调用的值,后者不会被覆盖(从我在JDK14源代码中看到的)
https://stackoverflow.com/questions/62262064
复制相似问题