2012-06-02 10 views
14

czytałem tutaj niektóre posty i zacząłem dlaczego niektórzy ludzieKorzystanie z nadrzędnymi getPreferredSize() zamiast używać setPreferredSize() na stałe składniki wielkości

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(500, 500); 
} 

zamiast

setPreferredSize(new Dimension(500, 500)); 

nie jest drugi lepiej, ponieważ tworzy tylko jeden obiekt Dimension, podczas gdy pierwszy prawdopodobnie tworzy kilka (nawet jeśli to nie jest tak dużo zmarnowanej pamięci)? Czy ja się mylę? Czy w ogóle istnieje różnica?

+5

[niektóre zasady] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-setpreferredmaximumminimalsize-methods-in-java-swi) – mKorbel

+0

Dzięki za link. Chociaż to trochę dziwne, że w jednym artykule wymienionym w górnej odpowiedzi mówi się "nigdy nie używaj tej metody [setPreferredSize] !!!" ponieważ nigdy nie miałem z tym żadnych problemów. Ale potem znowu nigdy nie napisałem naprawdę dużych/złożonych interfejsów użytkownika. – IchBinKeinBaum

+0

to jest o programowaniu na najwyższym poziomie :-), ale powiedz, jak unikać błędów, nikt nie mówi, że używanie LayoutManager to łatwa praca, wymaga a) nauki i próbowania, b) zadawania kilku pytań – mKorbel

Odpowiedz

14

Ogromną różnicą jest to, jak wartość może zmieniać się z upływem czasu, a więc ten, który wybierzesz, powinien być zależny od tego, co chcesz zrobić z kodem.

Jeśli po prostu zadzwonisz pod numer setPreferredSize(new Dimension(500, 500));, zrobi to zgodnie z oczekiwaniami - ustawi preferowany rozmiar na 500 x 500. Jednak inny kod w aplikacji może potencjalnie zastąpić tę wartość nową - wszystko może wywołać setPreferredSize(), a ostatnie wywołanie tej metody będzie wynikiem końcowym.

Jeśli jednak zastąpisz w swoim kodzie metodę getPreferredSize(), zawsze zawsze zwróci 500x500. Nie ma znaczenia, czy któryś z twoich kodów wywołuje metodę setPreferredSize(), ponieważ są one skutecznie ignorowane. Jeśli przesłonisz także getMinimumSize() i getMaximumSize(), możesz wymusić stały rozmiar komponentu, który nie powinien się zmieniać bez względu na rozmiar okna i innych komponentów.

Jednak, jak wspomina @Andrew Thompson w komentarzach, nie jest to gwarantowane, ponieważ niektórzy menedżerowie układu mogą je zignorować, zwłaszcza jeśli piszesz własny menedżer układu i dodajesz komponent niestandardowy do jakiegoś elementu nadrzędnego. kontenery będą również ignorować te metody, w zależności od miejsca/sposobu użycia komponentu. Bez względu na to, jest jeszcze bardziej sztywny niż wywołanie setPreferredSize(), który może być łatwo wywołany przez inny kod i całkowicie nadpisany.

ja też zastąpić metodę (plus getMinimumSize() i getMaximumSize()) getPreferredSize() dla żadnego z moich niestandardowych składników, takich jak próbnik kolorów, który musi mieć określone wymiary dla komponentu być odpowiednio pomalowane. Bez przesłonięcia tych metod menedżery układu Swing nie wiedzą, w jaki sposób można dostosować położenie niestandardowego komponentu i dostosować go do rozmiaru obiektu JFrame lub JPanel.

+0

Dzięki @AndrewThompson, tak to prawda - próbowałem zmienić swoją odpowiedź, aby lepiej to odzwierciedlić. Moją intencją było to, że jest to sztywniejszy sposób ustalania rozmiaru komponentów, ale niekoniecznie jest to gwarantowane. – wattostudios

+0

Dobra edycja. Hałas został usunięty. +1 –

+0

Dzięki za wyczyszczenie tego. – IchBinKeinBaum