2013-10-18 14 views
5

Ich verwende den Code aus this stackOverflow post, das tut, was ich erwarten:Warum gibt UIManager.getDefaults(). KeySet() andere Werte zurück als UIManager.getDefaults(). Keys()?

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

Ich versuchte es mit dem folgenden Code zu Refactoring, die nur durch ein paar Klassen in javax.swing.plaf Schleifen statt der vollständige Satz von Komponenten. Ich habe versucht, um die Swing-API und HashTable-API zu graben, aber ich fühle mich, als ob ich immer noch etwas offensichtlich fehlt.

Irgendwelche Ideen, warum der erste Block des Codes überläuft und alle Font-Ressourcen ändert, während der zweite nur eine Handvoll von Elementen durchläuft?

+1

Siehe auch diese verwandten [Q & A] (http://stackoverflow.com/q/5729306/230513). – trashgod

Antwort

2

Das ist eine nette Frage, die Antwort y, dass die Methode, die Sie verwenden, verschiedene Objekte vervollständigt.

UIManager.getDefaults(). Keys(); eine Enumeration zurückgeben. Die Aufzählung ist nicht besorgt darüber, dass Objekte, die in der Sammlung wiederholt werden, iteriert werden.

UIManager.getDefaults(). KeySet() Gibt ein Set zurück und kann daher keine repetierten Objekte enthalten. Wenn Elemente in die Menge eingefügt werden, wird die Methode que des Objekts verwendet, um zu prüfen, ob das Objekt bereits auf dem Satz ist. Sie suchen Objekte von Art FontUIResource und diese Objekte haben eine der folgenden Implementierung os gleich Methode:

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. 

So auf den setzen alle Schlüssel Art FontUIResource mit einem Argument beschreibt die gleiche Schriftart werden nicht auf die gesetzten eingefügt, von denen einer eingefügt ist. Folglich hat das Set nur eine Teilmenge der Schlüssel auf der Karte.

Mehr Informationen zu Java-Sets auf:

http://goo.gl/mfUPzp

+0

Danke, @nrodriguez. Ich bin vertraut mit den Unterschieden zwischen Enumerations und Sets, aber ich habe nicht erkannt, dass FontUIResource auf diese Weise gleich definiert ist! –