O JPanel w stałym rozmiarze na JFrame

Jakiś czas temu poszukiwałem sposobu, aby zmodyfikowany przeze mnie JPanel zachowywał swój rozmiar niezależnie od wielkości okienka (obiekt JFrame), na którym bezpośrednio leżał. Kosztowało mnie to nieco nerwów. Nie wystarczyły metody setSize, setPreferredSize, setMaximumSize, setMinimumSize, użyte jak w poniższym przykładzie:

setSize(width, height);
setMaximumSize(getSize());
setMinimumSize(getSize());
setPreferredSize(getSize());

Niezależnie od moim starań potomek JPanel rozlewał się na całą powierzchnię obiektu JFrame. Winnym jest tutaj domyślny LayoutMenager obiektów JFrameBorderLayout (wniosek: warto zaglądać do dokumentacji). Osobiście uważam to za drażniące zachowanie rozszerzać na siłę element, łamiąc jego maksymalny ustawiony rozmiar, ale jak się nie ma co się lubi, to się lubi co się ma.

Rozwiązania widzę dwa: pierwsze to zmienić JFrame menadżera rozmieszczania elementów na np. FlowLayout. Drugim rozwiązaniem jest wstawienie naszego obiektu, nazwijmy go MyJPanel, w nowo utworzony obiekt JPanel i dopiero ten wstawić do JFrame. Zilustruje to małym przykładem:

JFrame frame = new JFrame("Test");
JPanel p = new JPanel();
p.add(new MyJPanel());
frame.getContentPane().add(p);

Teraz ten nowy, opakowujący JPanel jest rozszerzany przez obiekt okienka programu, a nasz – właściwy – pozostaje nietknięty. W sumie ta druga metoda to zastosowanie tej pierwszej w nieco inny sposób, ale może się przydać, jeśli z jakiegoś powodu nie mamy pełnego dostępu do obiektu JFrame.

Linki

3 thoughts on “O JPanel w stałym rozmiarze na JFrame

  1. Dzięki, choć wstawione elementy, trzeba potem dodatkowo obsłużyć, ale pomysł całkiem dobry.
    Chyba było by to podobne rozwiązanie do takiego, gdzie napisalibyśmy własny menadżer.

    Like

  2. Można jeszcze ustawić odpowiednie rozmieszczenie głównego obiektu (ktory dziedzyczy po JFrame) i dodać po kolei kontenery do kolejnych obszarów i w nich znowu ustawiać odpowiednie rozmieszczenia (np ten kontener będzie miał standardowy układ rozmieszczenia i w niego wrzucić JPanel), nie jestem pewny ale być może da się to jeszcze zrobić ustawiając JFrame.setLayout(null) a później dodać panel.setBounds(x,y, H, W)

    pozdrawiam

    Like

Comments are closed.