Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Myślę nad koncepcją zrealizowania takiego czegoś :
Jest JFrame a w nim panel a w panelu baton. Klikam buton i pojawia się drugi panel pod pierwszym (stykają się krawędziami). Przesuwam okno z pierwszym panelem a drugie bez odrywania przylepione do dolnej krawędzi dolnego panelu podązą za tym pierwszym.
Przychodzi mi jedynie do głowy stworzenie drugiego Jframea z panelem i ukrycie go na starcie - po kliknięciu butona by się pojawiał a jego pozycja byłaby przeliczana z przesunięcia tego pierwszego Jframea.
Trochę to pokomplikowane chyba sztucznie - jest jakiś easy way?
To nie takie proste ... mam statusbar na dole. Nad nim jest mainPanel i teraz oczywisćie moge dodawać i usuwac panele w tym panelu ale on sam po usunięciu nie skróci mi panelu tak by statusbar powrócił do początkowej pozycji. PO usunięciu mam lukę...
statusBar (panel) jest częścią JFrema. Lajałt to freedesign albo null. W sumie teraz myślę moze właśnie zmiana lajałtu by pomogła-sugestie...który najlepszy do pozycji o tej samej szerokosci rozłożonych jeden pod drugim?
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
bo
bo
0
Podobno BoxLayout. Byłem niezadowolony z dostępnych layoutów, i napisałem do rozmieszczania komponentów w słupku własny layout. Mogę udostępnić.
Hmm...no podeślij proszę. Tylko czy on mi automatycznie zrobi resize po usunięciu panelu? To chyba nie da się tak prosto - trzeba bedzie klepnąć to ręcznie hmm?
Ja bym użył BorderLayout, jest łatwy w obsłudze i ma 5 pól: NORTH, SOUTH, CENTER, WEST i EAST. Zatem ten dolny ustawiasz na South. Wadą jest to, że Center zabiera całe wolne miejsce, ale możesz użyć tylko North. http://download.oracle.com/javase/tutorial/uiswing/layout/border.html
Musiałbyś tylko ręcznie zarządzać rozmiarem okna.
Ewentualnie JWindow i ComponentListener, żeby zawsze trzymał się pod tamtym okienkiem, ale to trochę więcej roboty
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
bo
bo
0
Działający przykład (może się jeszcze komuś przyda):
Dzięki za kody. Testowałem i niestety nadają się ale nie do tego co chciałem osiągnąć. Nie mogłem zrobic tak by po usunięciu frame z automatu zmieniał się rozmiar. Więc zrobiłem oszukaństwo i sam po usunięciu panelu zmieniałem rozmiar frame'a (bylo to prawdopodobnie spowodowane tym że każdy z moich komponentów ma ustawiony setPreferedSize).
Po usuwaniu panelu znowu pojawiał się problem z dodawaniem panelu - panel ten był raczej skomplikowany - zawierał iles podpaneli, tabel etc. Musiałem usuwać wszystko idac w dół drzewa i znowu dodawać od dołu do góry - efekt był mizerny i do tego trudny w utrzymaniu.
Wiec zrobiłem po prostu zmniejszanie panelu do wysokości 0 i potem znowu go rozszerzanie. Zachowuje lajołty i ustawienie komponentów etc:
Niech mi ktos wytłumaczy czym się różni preferedsize od size - bo według mojej wiedzy pierwsze znaczyło że moze a nie musi - w zależnosci od rozmiaru komponentu wyzej w drzewie...a drugi to na twardo.
A teraz dodatek : robił ktoś może wysuwanie sie panelu płynnie? Wysuwa się i chowa ale nie od razu tylko jakoś liniowo albo i nawet nieliniowo (na początku szybko a potem wolniej).
Jeszcze sie za to nie zabralem ale wywoływanie repaint() i zmienianie size troche wydaje mi się kulwawe...
Mam wrażenie, że coś zrobiłeś źle (tzn. niezgodnie z przykładem).
Wywołanie pack() powoduje automatyczną zmianę rozmiaru całego okna.
Usunięcie panelu z okna usuwa wszystkie komponenty okna, nie jest potrzebna żadna zabawa z komponentami.
Masz rację pod warunkiem że to lajołtowi zostawia się dobranie rozmiarów do okna (Czy odwrotnie patrząc to okno po wywołaniu pack() się dosuwa).
Problem jest że ja wszystkie komponenty nie wiem dlaczego netbeans ustawia mi przez setpreferedSize. Wtedy wywołanie pack() nie daje żadnych rezultatów.
Dzięki Panowie - popracuje jeszcze. M.in. jak w netbeans zmusić by nie wstawiał domyślnych wartosci preferowanego rozmiaru. null w customize code nie pomaga.
Na razie moze i niezbyt eleganckie działanie ale działa.
EDIT: Doczytałem i setPreferedSize różni sie tym od setSize, że ten pierwszy stosujemy własnie wtedy gdy rodzic posiada lajałt. Natomiast drugi stosuje się własnie dla Jfreamów desktopów czy internalFramów oraz dla komponentów wewnątrz scrolled panes.
W netbeans każdy komponent ma domyślnie freeDesign czyli taki groupLayout - stąd poprawnie mam wszystko na setPreferedSize. Nie umiem natomiast rozwikłać JFrame...tam jest Designer Size-i tego w kodzie nigdzie znaleźć nie umiem. A wiem że ma wpływ na rozmiar bo jak zmieniam to sie zmienia. szukałem w properitisach, xmlach i kodzie i kurde nie ma.
Widok kodu wygenerowanego przez NetBeans i opisy walk programistów z graficznym projektantem utwierdzają mnie w dawno podjętym postanowieniu, by cały kod pisać, a nie wyklikiwać.
(Mogę na kod mogę patrzeć bez obrzydzenia.)
Ja wyklikuję ile się da i nie przeszkadza mi to w późniejszej obróbce w kodzie. Po prostu: to co stałe można wyklikać. Jak jakiś element ma się zmieniać, to tworzę JPanel który później z kodu obsługuję, a tą zmienianą treść też wyklikam w obrębie tej samej formatki (jako Other components)
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.