Java - tworzenie GUI

0

Tworzyłem już wcześniej interfejsy graficzne w Qt oraz w javie na platformę android.
Nigdy nie miałem aż takich problemów jak teraz, korzystając z biblioteki Swing.
W jaki sposób mogę chociażby ustawić stałą wielkość obiektu JPanel?
Dlaczego funkcje setMinimumSize/setMaximumSize nie działają?
Jak mogę zrobić 2 obiekty JPanel, z których jeden zajmuje np. 30% a drugi 70% dostępnej szerokości.

Z góry dzięki za pomoc / jakieś linki.

PS. Aktualnie korzystam z biblioteki Swing i edytora WindowBuilder w eclipse, ale to dopiero początki więc jeżeli waszym zdaniem warto się na coś przerzucić to proszę pisać :]

0

spróbuj setPreferedSize() - winno pomóc.
Do konkretnego ustawienia komponentów w oknie służą przecież layout Managery. Ja korzystam z groupLayout (trochę zagmatwany i sporo pisania ale da się wytrzymać). Jest jeszcze BoxLayout. Do mniej skomplikowanych menedżerów należą flowlayout gridlayout borderlayout. Opisane na stronie Oracla.

http://download.oracle.com/javase/tutorial/uiswing/layout/using.html

0

Używam BoxLayout, mam 2 JPanel ustawione obok siebie.
Jak mam teraz zrobić żeby np. jeden z nich miał zawsze 100px, a drugi zajmował resztę okna?
Mogę ustawić pierwszemu preferredsize na te 100px, ale co z drugim?
Muszę dynamicznie obliczać ile ma zajmować i ustawiać preferredsize za każdym razem kiedy uzytkowanik zmienia wielkosc okna?

0

PS. Aktualnie korzystam z biblioteki Swing i edytora WindowBuilder w eclipse, ale to dopiero początki więc jeżeli waszym zdaniem warto się na coś przerzucić to proszę pisać
Jasne, że warto się przerzucić, bo same biblioteki GUI Javy nie są pierwszej klasy. Jeżeli znasz Qt i Eclipse to najlepiej będzie Ci skorzystać z QtJambi. http://dev-kof.blogspot.com/2010/06/instalacja-qt-jambi-w-eclipse.html

0

Zdecydowanie wolałbym to zrobić w "zwyklej" Javie.
Bez przesady, chyba da się jakoś ustalić stałą szerokość komponentu.

0

Za mało danych by udzielić sensownej odpowiedzi:
Czy rozmiar całego okna jest stały czy też ustalany metodą pack() na podstawie rozmiarów zawartych w nim komponentów?
Ile jest komponentów w głównym oknie (dwa panele)?
Menadżerem dla okna jest BoxLayout(X_AXIS)?

0

Czy rozmiar całego okna jest stały czy też ustalany metodą pack() na podstawie rozmiarów zawartych w nim komponentów?

Nie, użytkownik może normalnie zmieniać rozmiar okna.

Ile jest komponentów w głównym oknie (dwa panele)?

Tak, załóżmy, że dwa.

Menadżerem dla okna jest BoxLayout(X_AXIS)

Wydaje mi się, że to jest najlepsze rozwiązanie, oczywiście mogę użyć innego.

W Qt wystarczyło dać jednemu z komponentów SizePolicy: expanding i już mielibyśmy efekt o który mi chodzi.

0

Ja używam edytora w NetBeansie. Jak się go umie obsługiwać, to się umie robić dobre elastyczne fragmenty interfejsów.

Tworzę komponent na panelu, wyłączam mu resizability i włączam w tym które mają sie rozszerzać.

Ewentualnie JSplitPane i ustawiasz szerokość lewego/górnego komponentu w % (tzn. w Double 0..1)

0

W jaki sposób wyłączasz resizability komponentu?
Istnieje jakaś funkcja w stylu setResizability(boolean)?

0

setResizable(false)

0

U mnie nie działa...
"The method setResizable(boolean) is undefined for the type JPanel"

0

setResizable jest dla Frame i JFrame.

NetBeans przerabia zrobiony interfejs na kod. Używa do tego menedżera layoutów GroupLayout:

http://4programmers.net/Pastebin/1322

Label będzie stałej szerokości, pole tekstowe będzie się rozszerzać. Kodem ciężko to trochę ogarnąć. Ta rozszerzalność jest ustawiana w momencie obsadzania całego layouta.

Z tego co wiem to sam komponent nie może decydować o swoim rozmiarze, co najwyżej określa swój minimalny, maksymalny i preferowany rozmiar. Może po prostu ustaw maksymalny rozmiar.

0

Nie sprawdziłem, ale rzeczywiście nie ma, jest tylko dla JFrame i Frame.

0

Hmm, weźmy np. środowisko netbeans (napisane w Javie).
Po uruchomieniu po lewej pojawia się drzewo katalogów, a na środku edytor teksu:
http://upload.wikimedia.org/wikipedia/commons/a/ae/NetBeans-IDE-6.7.png

Jak widać przy zmianie rozmiaru okna szerokość drzewa katalogów nie zmieni się (chyba, że bardzo zmniejszymy okno).
Na prawdę nie da się tego uzyskać w prosty sposób, bez stosowania jakichś sztuczek?

0

NetBeans jest napisany z wykorzystaniem NetBeans Platform, nie w czystym Swing'u. W przeciwieństwie do Swing, uzyskanie takiego efektu w NetBeans Platform jest bardzo proste.

0

No dobra, w takim razie zaczynam pisać mój program w Qt :|
Gdyby komuś coś jeszcze wpadło do głowy to prosze pisać

0

spróbuj zastosować borderlayout z elementem zmieniającym rozmiar w środku

jeśli chce się korzystać z layoutmanagerów, to trzeba poznać wszystkie, żeby wiedzieć kiedy jakich używać

0

To co chcesz osiągnąć można uzyskać stosując GridBagLayout. Obu panelom ustawiasz fill na both, oraz odpowiednie weightx proporcjonalnie do tego jak zachłannie mają korzystać z nowej przestrzeni po rozciągnięciu okna. Całość kodu wygląda mniej więcej tak:

        jPanel1 = new JPanel();
        jPanel2 = new JPanel();
        getContentPane().setLayout(new GridBagLayout());

        jPanel1.setBackground(new Color(238, 139, 40));

        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.3;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(jPanel1, gridBagConstraints);

        jPanel2.setBackground(new Color(235, 237, 46));

        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.7;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(jPanel2, gridBagConstraints);

Jeżeli chcesz by któryś z paneli po prawej się nie rozszerzał, wystarczy ustawić mu prefferedSize na np. 100x100 i weightx na 0.

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