5

私はこの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));
        }
    }

コードの最初のブロックがループしてすべてのフォント リソースを変更するのに、2 番目のブロックは少数のアイテムのみをループする理由はありますか?

4

1 に答える 1

2

使用しているメソッドが完全に異なるオブジェクトを返すというのはいい質問です。

UIManager.getDefaults().keys(); 列挙を返します。列挙は、反復するコレクションのオブジェクトを繰り返すことを心配していません。

UIManager.getDefaults().keySet() 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 のすべてのキーがセットに挿入されず、そのうちの 1 つが挿入されます。したがって、セットにはマップ上のキーのサブセットのみが含まれます。

Java セットの詳細:

http://goo.gl/mfUPzp

于 2013-10-19T12:27:20.887 に答える