Zmiana rozmiaru okna w trakcie działania programu

0

Witam,
w moim programie mam następujący problem:
przec actionListenera dodaje do mojego okna tabele (JTable) i chciałbym, żeby okno automatycznie się dostosowało wielkością tak, żeby nie trzeba było ręcznie go powiększać. Gdy używam funkcji revalidate(), wszystkie komponenty zmiejszają się tak, żeby zmieściły się w oknie, zamiast powiększać okno. Proszę o pomoc z tym, jeszcze dodam, że korzystam z GridBagLayouta(nie wiem czy to ma znaczenie). Jestem poczatkującym, więc prosiłbym o wyrozumiałość^^

0

Nie pomogło:P
Prosiłbym o dalsze propozycje^^

1

Samoczynna zmiana rozmiarów okna przez aplikację jest jedną z najbardziej wkurzających cech, więc bardzo odradzałbym takie podejście. Tym bardziej, że nie masz pojęcia na jakim systemie i z jakim zachowaniem gui ktoś kiedyś Twój program odpali. Tak więc nie próbuj zarządzać oknami samemu. Ewentualnie całkiem sensowne byłoby zrobienie dla usera opcji automatycznej pracy zmaksymalizowanego okna lub zapamiętania pozycji okna na żądanie lub przy wyjściu. Maksymalizację robi się przez setExtendedState(MAXIMIZE_BOTH). Próbując powiększać okno musisz pamiętać o ty, że:

  1. user może mieć kilka desktopów
  2. user może mieć kilka monitorów
  3. oprócz rozmiarów bieżącego ekranu są jeszcze rozmiary marginesów (insets), które ograniczają użyteczny obszar ekranu (np. w Windows XP na każdym brzegu ekranu może istnieć pasek narzędziowy dowolnej szerokości w (trybie always on top), również niektóre Linuksy mogą tak mieć).
  4. Współrzędne konkretnego ekranu mogą w szczególnych wypadkach mieć wartości ujemne.
  5. Zmuszenie otwartego okna do zmiany rozmiaru może się czasem powieść tylko w sekwencji setVisible(false); setPrefferedSize();setVisible(true). Użytkownika zdenerwuje to tym bardziej bo dostanie przy okazji potężnego laga - np. wtedy kiedy w coś właśnie klikał.
0

Udało mi się to zrobić, dzięki za pomoc Olamagato.

this.getParent().getParent().getParent().getParent().setMinimumSize(new Dimension(400, 250));
this.getParent().getParent().getParent().getParent().revalidate();

Na początku zrobiłem setVisible(false), a później po ustawieniu rozmiaru zmieniałem wartość na true(tak jak proponowałeś), ale zauważyłem że revalidate też działa. Nie wiem, który sposób jest wydajniejszy/jakie mają wady i zalety, ale w ten sposób kod jest bardziej przejrzysty. Nie udało mi się przekazać w argumencie JFrame, dlatego taki śmieszny zapis trochę.

Mój program na początku ma rozmiar 300x100, a przy pojawieniu się tabeli zwiększam tylko wysokość o ~200 pikseli, więc nie wydaje mi się żeby to był jakiś problem dla użytkownika, chociaż pewnie wszystko wyjdzie dopiero w praniu co i jak.

Póki co u mnie nie widać żadnego zauważalnego laga, okno powiększa się natychmiastowo.

W każdym razie, Olamagato masz plusa ode mnie:)

0
Kalse napisał(a):

Mój program na początku ma rozmiar 300x100, a przy pojawieniu się tabeli zwiększam tylko wysokość o ~200 pikseli

OK. Pamiętaj tylko, że:

  1. User może trzymać okno Twojego programu tuż przy dolnej krawędzi ekranu - zwiększając rozmiar przesuniesz dolną krawędź okna poniżej ekranu/paska zadań itp., czego user może w ogóle nie zauważyć (tzn. nowej treści). I wtedy może być konsternacja.
  2. Zmienianą wysokość możesz ustalić eksperymentalnie, ale za jakiś czas Twoje założenia co do wysokości komórek i wielkości czcionki mogą przestać być aktualne. Najbezpieczniej jest więc wyliczać taki rozmiar dynamicznie w oparciu o to co naprawdę zmienia się w tabeli - np. Potrzebujesz 3 komórek więcej, to sprawdzasz ich obecny rozmiar w pikselach (zakładając tutaj, że są tej samej wysokości - co wcale nie musi być prawdą), mnożysz przez 3 i dodajesz do obecnego.

Co do tych getParentów, to weź pod uwagę, że w ten sposób uzależniasz tabelkę od tego w czym siedzi, a JFrame od jednego z jego komponentów. Jeżeli kiedyś najdzie Cię ochota wbudowania jej w jakiś aplet, to będziesz musiał pamiętać o zmianie tego kawałka kodu na inny - a to wcale nie wynika z właściwości tabelki. Potrzebny będzie wtedy kobylasty javadoc, który będzie o tym mówił "dużymi literami". ;)

Warto też pamiętać o możliwościach metod doLayout() oraz pack(). Pierwsza na nowo organizuje komponenty w oknie o zmienionym rozmiarze, a druga dopasowuje okno do zmienionych rozmiarów komponentów. W tym drugim wypadku też potrzebne jest setVisible(false).

1 użytkowników online, w tym zalogowanych: 0, gości: 1