Swing - dynamiczne tworzenie komponentów

0

Cześć!

Piszę program w NetBeans.

Zrobiłem sobie takie okienko:
user image

Zaprojektowałem sobie również taką "cegiełkę":
user image

Chciałbym, aby przy każdym kliknięciu przycisku Add, na żółtym panelu pojawiała się kolejna taka cegiełka.

W tym momencie robię to tak:

        int i = 0; //globalna
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        DynamicPane dp = new DynamicPane();
        dp.setBounds(0, i*30, 250, 25);
        jPanel2.add(dp);

        this.pack();
        i++;

    }
public class DynamicPane extends JComponent {
    private JButton jb;
    private JTextField jt;
    private JCheckBox jc;

    public DynamicPane(){
        jb = new JButton("X");
        jt = new JTextField("tekst");
        jc = new JCheckBox();

        jc.setBounds(1, 1, 20, 25);
        jt.setBounds(30, 1, 100, 25);
        jb.setBounds(130, 1, 200 , 25);


        this.setPreferredSize( new Dimension(250,20) );
        this.setMinimumSize( new Dimension(250,20) );
        this.setLayout(null);
        this.add(jc);
        this.add(jt);
        this.add(jb);

        this.repaint();
   }
}

W miarę to działa.

Gdybyście to skompilowali, zobaczylibyście jednak, że to rozwiązanie się raczej do niczego nie nadaje - nie trzyma wymiarów itp ..

Jak zrobić to elegancko, żeby trzymało rozmiar, żeby wszystko się mieściło itp? Panele obsługuje NetBeans!

Bardzo chętnie poczytam sugestie zarówno co do klasy DynamicPane jak i metody wstawiania jej do okna..

0

Z tego co zrozumiałem musisz ustawić jakiś ContainerListener, który będzie reagował na zmiany okna i wprowadzał odpowiednia korekty na komponentach. Już coś podobnego było gdzieś na forum.

Poza tym jak ten cegiełki się ukłądają, od lewej do prawej i w dół? To użyj jakiegoś zarządcy układu, i nie baw się w układanie na sztywno.

W sumie ja tu nie widzę potrzeby stosowania takich udziwnień, ale nie wiem czy dobrze Cię zrozumiałem.

0

cegiełka jest w szerokości jak żółty panel, mają układać się jedna pod drugą.

Po pierwsze, jakiego zarządce wybrać dla panelu?
Po drugie, czy taki komponent, jak "Cegiełka", mogę zaprojektować w NetBeans graficznie?

0

Można zaprojektować, ale odradzam Ci takie rozwiązania. GUI Builder w NetBeans to zło najgorszej postaci.

Hmmyy, BoxLayout?

Zależy co masz jeszcze w takiej cegiełce, jeśli etykietę plus pole tekstowe to w środku użyj np FlowLayout, jak coś bardziej skomplikowanego to SpringLayout na przykład.

Poczytaj u Sun'a o zarządcach to sobie dobierzesz najodpowiedniejszego do swoich potrzeb

0

@GhostDog
Możesz uzasadnić dlaczego robienie paneli w Matisse, to "zło w najgorszej postaci"?
Wiele razy robiłem sobie różne kawałki w GUI NB i miałem dzięki temu po prostu oszczędność czasu.
Różne bardziej skomplikowane układy wzajemnie zależnych komponentów są moim zdaniem nie do napisania ręcznie w akceptowalnym czasie. Na przykład okienka ze splitami dzielącymi okna wg jakichś reguł lub komponenty zmieniające dynamicznie swoje wymiary zależnie od wymiarów rodzica.

0

@Olamagato
@Olomagato
Za mocno się może wyraziłem odnośnie Matisse, ale w przypadku prostego GUI, także gdy się jest początkującym poznanie tych podstaw myślę, że jest obowiązkowe.

Poza tym istnieją odpowiedniki, np. pod Eclipse tworzące kod znaczniej lepszej jakości.
Oprócz tego ktoś jeszcze na forum podał http://www.miglayout.com/ za bardzo przystępny lm.

Takie moje zdanie / skrzywienie, bo sam na początku długo klepałem GUI ręcznie.

No i kiedyś też zrobiłem split'y w matisse, to nie jakaś hipokryzja z mojej strony, uważam po prostu że pewne podstawy trzeba znać.

0

Moje rozwiązanie, gdyby kogoś interesowało:

wewnątrz cegiełki: po prostu flow layout
wewnątrz panelu: box layout (Y-AXIS)

Działa pięknie :)

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