Automatyczne skalowanie paneli w JFrame

0

Hej,
mam problem ze skalowaniem paneli umieszczonych w JFrame. Początkowy rozmiar jest ok, jednak po rozciągnięciu ramki panele ciągle zachowują swój rozmiar.
Struktura wygląda tak:
JFrame

  • po lewej JPanel z rysowaniem o rozmiarze 500x500

  • po prawej JPanel z konfuguracją rysowania o rozmiarze 200x500

Rozmiar paneli jest ustalany za pomocą setPrefferedSize, w ramce jest wywoływana pack(), żeby wszystko dopasować.
Próbowałem wykorzystać zarówno GridLayout i BorderLayout jednak to nic nie zmienia - podejrzewam, że ma to związek z setPrefferedSize() - ale bez wywołania tej metody panel do rysowania pojawia się w minimalnym rozmiarze.
Czy da się to zrobić automatycznie, czy przy każdym repaincie muszę pobierać rozmiar ramki i skalować panele dynamicznie samodzielnie ustawiając ich rozmiar?

0

FlowLayout automatycznie skaluje wielkość do okna.

0

Problem w tym, że żaden Layout w tym przypadku nie skaluje paneli.
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JFrame frame = new JFrame();

p1.setPrefferedSize(...)
p1.setPrefferedSize(...)

frame.add(p1)
frame.add(p2)
frame.pack()

a przynajmniej po dodaniu wszystkiego według powyższej kolejności. Oczywiście nie są to gołe JPanele, tylko rozszerzające je klasy, a których jednak nic specjalnego się nie dzieje.

0

A czemu layout miałby skalować panel, skoro ustaliłeś rozmiar tego panelu?

0

możesz obliczać rozmiar komponentów na podstawie aktualnego rozmiaru okna.
W tym celu zaimplementuj componentListener i w metodzie componentResized musisz napisać metodę skalującą każdy komponent, przynajmniej ja tak u siebie robiłem.

0

bogdans na przykład dlatego, że w ogólności nie ma z tym problemu i zarządca rozkładem - GridLayout i BorderLayout są skonstruowane w ten sposób, że mają dopasowywać element komponentów "dzieci" do rodzica. setPrefferedSize() nie służy do ustalenia rozmiaru na stałe.

Tak na przyszłość, bo może komuś się przyda:
był to oczywiście mój błąd - przed dodaniem do ramki pobierałem wszystkie komponenty do dodania jako Component[] i je kolejno dodawałem do JFrame. Po zamienieniu typu na JPanele wszystko działa już bez problemu - trochę dziwne, ale skuteczne.
@kalar dzięki za odpowiedź, szerokość jednego z paneli i tak muszę zablokować, żeby się nie zmieniała więc i tak muszę to wykorzystać :)

0

Piotrekx99, w ogólności jest z tym problem. GridLayout i BorderLayout są nietypowe, w nich dopasowywane są wielkości komponentów do siebie nawzajem. W pozostałych menadżerach nie ma dopasowywania. Menadżer respektuje podane przez programistę rozmiary komponentów.

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