2013-10-18 10 views
5

Używam kod z this stackOverflow post, który robi to, co ja się spodziewać:Dlaczego funkcja UIManager.getDefaults(). KeySet() zwraca różne wartości niż klucze UIManager.getDefaults().()?

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

Próbowałem byłaby go do następującego kodu, który pętle tylko przez kilka klas w javax.swing.plaf zamiast pełny zestaw komponentów. Próbowałem kopać wokół interfejsu API i interfejsu API HashTable, ale czuję, że wciąż brakuje mi czegoś oczywistego.

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

jakieś pomysły dlaczego pierwszy blok kodu obwodów nad i zmienia wszystkie zasoby czcionek, natomiast druga pętla tylko przez garstkę maszyn?

+1

Patrz także to związane [Q A] (http://stackoverflow.com/q/5729306/230513). – trashgod

Odpowiedz

2

To miłe pytanie odpowiedź y, że metoda, której używasz zwraca kompletne różne obiekty.

UIManager.getDefaults(). Keys(); Zwróć wyliczenie. Wyliczenie nie martwi się o to, że obiekty z kolekcji będą replikowane do iteracji.

UIManager.getDefaults(). KeySet() Zwraca zestaw i dlatego nie może zawierać powtarzanych obiektów. Kiedy elementy będą wstawiane na zestawie, que = metoda obiektu jest używana do sprawdzenia, czy obiekt jest już na zestawie. Szukasz obiektów rodzaju FontUIResource i to obiekty mają następujące os realizacja równa metody:

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. 

itd zbiorze wszystkich kluczy rodzaju FontUIResource z argumentem opisujący samej czcionki nie są wstawiane na zestawach, do których wstawiono jeden z nich. Konsekwentnie zestaw ma tylko podzbiór klawiszy na mapie.

Więcej informacji o zestawach Java w:

http://goo.gl/mfUPzp

+0

Dzięki, @ nrodriguez. Jestem zaznajomiony z różnicami między wyliczeniami i zestawami, ale nie zdawałem sobie sprawy, że zdefiniowane w ten sposób FontUIResource jest równe! –

Powiązane problemy