Neobnovení GridBagLayoutu – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Neobnovení GridBagLayoutu – Java – Fórum – Programujte.comNeobnovení GridBagLayoutu – Java – Fórum – Programujte.com

 

Tomáš
~ Anonymní uživatel
560 příspěvků
3. 8. 2016   #1
-
0
-

Dobrý den,
   před pár hodinami jsem sem vkládal dotaz ohledně programu s kostkami, bylo to nepřehledné. Proto jsem přišel s triviálním programem na lepší pochopení mého dotazu.

Když spustím tento program vidím 6 vykreslených čtverců v panelu pomocí GridBagLayoutu. Když kliknu na tlačítko, tak se počet vykreslených čtverců postupně mění. Např. vykreslím pomocí tlačítka 2 čtverce. Problém je, že Layout manager si pořád pamatuje souřadnice minulých 6 čtverců (nevím jak) a tyto 2 čtverce vypisuje do 2 sloupců (ze 6) zleva, místo toho aby byli dva čtverce souměrně zarovnané na střed. Když změníte hodnotu "MAX = 2" a znovu zapnete, tak podle mého, by to mělo vypadat takto.
Jak to že nevypadá? Vždyť v metodě vlozitCtverce() znovu postupně vkládám (do 2 sloupců) zmíněné 2 čtverce. Poraďte prosím.  
 


import java.awt.*;
import java.awt.event.*;

public class Okno extends Frame {

    VypisCtvercu panel;
    Button tlacitko;

    static final int MAX = 6;

    Okno() {
        super("Okno");
        panel = new VypisCtvercu(MAX);
        tlacitko = new Button("Prepni pocet ctvercu");

        this.setLayout(new BorderLayout());

        this.add(panel, BorderLayout.CENTER);
        this.add(tlacitko, BorderLayout.SOUTH);
        tlacitko.addActionListener(new tlacitkoAL());

        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        this.pack();
    }

    class tlacitkoAL implements ActionListener {

        int pocet = MAX;

        public void actionPerformed(ActionEvent e) {
            pocet++;
            if (pocet > 6) {
                pocet = pocet - 6;
            }
            Okno.this.panel.vlozitCtverce(pocet);
        }
    }

    public static void main(String[] args) {
        new Okno().setVisible(true);
    }
}
 class VypisCtvercu extends Panel {

    GridBagLayout layout;
    GridBagConstraints constraints;

    Platno[] platno;
    Label[] label;

    int pocetVypsanychCtvercu;

    public VypisCtvercu(int pocet) {
        layout = new GridBagLayout();
        constraints = new GridBagConstraints();
        this.setLayout(layout);

        platno = new Platno[pocet];
        label = new Label[pocet];

        for (int i = 0; i < pocet; i++) {
            platno[i] = new Platno();
            platno[i].setSize(150, 150);
            vlozKomponentu(platno[i], i, 0, 1, 1, 0, 0);
            label[i] = new Label((i + 1) + ")");
            vlozKomponentu(label[i], i, 1, 1, 1, 0, 0);
        }
        pocetVypsanychCtvercu = pocet;
    }

    public void vlozKomponentu(Component co, int gridx, int gridy, int gridwidth, int gridheight, int weightx, int weighty) {
        constraints.gridx = gridx;
        constraints.gridy = gridy;
        constraints.gridwidth = gridwidth;
        constraints.gridheight = gridheight;
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.insets = new Insets(0, 0, 0, 10);
        layout.setConstraints(co, constraints);
        this.add(co);
    }

    public Dimension getMinimumSize() {
        return new Dimension(900, 173);
    }

    public Dimension getPreferredSize() {
        return getMinimumSize();
    }

    public void vlozitCtverce(int pocetCtvercu) {
        odstranitVse();
        layout = new GridBagLayout();
        constraints = new GridBagConstraints();
        for (int i = 0; i < pocetCtvercu; i++) {
            vlozKomponentu(platno[i], i, 0, 1, 1, 0, 0);
            vlozKomponentu(label[i], i, 0, 1, 1, 0, 0);
        }
        pocetVypsanychCtvercu = pocetCtvercu;
    }

    public void odstranitVse() {
        for (int i = 0; i < pocetVypsanychCtvercu; i++) {
            this.remove(platno[i]);
            this.remove(label[i]);
        }
    }
}
class Platno extends Canvas {

    public void paint(Graphics g) {
        Dimension d = getSize();
        int sirka = (d.width > d.height) ? d.width : d.height;
        g.setColor(Color.black);
        g.fillRect(0, 0, sirka, sirka);
    }
}
Nahlásit jako SPAM
IP: 213.226.245.–
NotBeginner
~ Anonymní uživatel
185 příspěvků
4. 8. 2016   #2
-
0
-

1) V této knize máš kvalitně vysvětlené práci s GUI v AWT( swingu) (http://knihy.abz.cz/prodej/java-graficke-uzivatelske-prostredi-a-cestina-1). V té knize je taky kvalitně vysvětlení používání Canvasu a jeho metod paint(), repaint(). - viz. tvé předchozí dotazy z vykreslením Canvasu.

2) Layout(rozvržení gui komponent) který používáš není dynamický takže je pochopitelné, že když odstraniš objekt(komponentu) tak se nezmění jejich umístění, na to jsou jiné layouty.

3) Pokud chceš dojít ke změně umístění je nutno v události ve které dochází ke změně komponent taktéž provést změnu polohy - to je snad jasné, ne?

Nahlásit jako SPAM
IP: 217.112.161.–
Tomáš
~ Anonymní uživatel
560 příspěvků
4. 8. 2016   #3
-
0
-

#2 NotBeginner


1) tuto knihu vlastním, s canvas problém nemám, pouze s tímto layoutem
2) a které jsou tedy dynamické? FlowLayout a GridLayot?
3) toto nechápu, změnu čeho?

+4) v metodě vlozitCtverce() ale přece celej Layout nuluji  (new GridBagLayout()) a vloženým čtvercům znovu přiřazuji nové constrains a pak vkládám, tak jak to že si to stále pamatuje, že kdysi tam bylo 6 čtverců (sloupců)? Neexistuje nějaká metoda, která layout aktualizuje a vymažou se tyto prázdná místa? A nebo jaký použít layout, abych dosáhl požadovaného výsledku? GridLayout?

Děkuji moc za reakci :)

Nahlásit jako SPAM
IP: 213.226.245.–
NotBeginner
~ Anonymní uživatel
185 příspěvků
4. 8. 2016   #4
-
0
-

2) na FlowLayout je takový dynamický ale vhodnější je CardLayout.

3) 4) Zde jsem tě uvedl trochu v omyl, tvůj kód jsem pořádně neprostudoval. Takže metoda vlozitCtverce() vola vlozKomponentu() a zde skutečně provádíš tvz. úpravu souřadnic gridbaglayoutu. Přestože v metodě vlozitCtverce() přepisuješ referenci GridBagLayout i GridBagConstraints což by mělo stačit k tobě požadovaného efektu ale zjevně nestačí. Možná je nutno pro refresh layoutů provést novou inicializaci i tohoto VypisCtvercu panel objektu a tudíž celé to rozvržení provést znova.

Žadné metody pro vymazani (refresh) layoutu neexistují nebo o nich nevím. Myslím, že jsem to vždycky řešil novým objektem(referencí) v Panelu (VypisCtvercu panel)  do kterého jsem to znovu všechno nastavil.

Jako první variantu bych to zkusil FlowLayout, poté CardLayoutem a v posledním případě bych provedl přepsaní znova celého panelu.

Nahlásit jako SPAM
IP: 217.112.161.–
Tomáš
~ Anonymní uživatel
560 příspěvků
4. 8. 2016   #5
-
0
-

Založit nový panel mě nenapadlo, to zní dobře a mělo by to fungovat.

Díky moc za rady :)

Nahlásit jako SPAM
IP: 213.226.245.–
Tomáš
~ Anonymní uživatel
560 příspěvků
4. 8. 2016   #6
-
0
-

Tak jsem to tedy vyřešil přes znovu vytvoření panelu, stačilo jen přepsat 2 řádky, děkuji moc :) 


import java.awt.*;
import java.awt.event.*;

public class Okno extends Frame {

    VypisCtvercu panel;
    Button tlacitko;

    static final int MAX = 6;

    Okno() {
        super("Okno");
        panel = new VypisCtvercu(MAX);
        tlacitko = new Button("Prepni pocet ctvercu");

        this.setLayout(new BorderLayout());

        this.add(panel, BorderLayout.CENTER);
       
        this.add(tlacitko, BorderLayout.SOUTH);
        tlacitko.addActionListener(new tlacitkoAL());

        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        this.pack();
    }

    class tlacitkoAL implements ActionListener {

        int pocet = MAX;

        public void actionPerformed(ActionEvent e) {
            pocet++;
            if (pocet > 6) {
                pocet = pocet - 6;
            }
            Okno.this.remove(panel);
            panel = new VypisCtvercu(pocet);
            Okno.this.add(panel);
            Okno.this.pack();
        }
    }

    public static void main(String[] args) {
        new Okno().setVisible(true);
    }
}
 class VypisCtvercu extends Panel {

    GridBagLayout layout;
    GridBagConstraints constraints;

    Platno[] platno;
    Label[] label;

    int pocetVypsanychCtvercu;

    public VypisCtvercu(int pocet) {
        layout = new GridBagLayout();
        constraints = new GridBagConstraints();
        this.setLayout(layout);

        platno = new Platno[pocet];
        label = new Label[pocet];

        for (int i = 0; i < pocet; i++) {
            platno[i] = new Platno();
            platno[i].setSize(150, 150);
            vlozKomponentu(platno[i], i, 0, 1, 1, 0, 0);
            label[i] = new Label((i + 1) + ")");
            vlozKomponentu(label[i], i, 1, 1, 1, 0, 0);
        }
        pocetVypsanychCtvercu = pocet;        
    }

    public void vlozKomponentu(Component co, int gridx, int gridy, int gridwidth, int gridheight, int weightx, int weighty) {
        constraints.gridx = gridx;
        constraints.gridy = gridy;
        constraints.gridwidth = gridwidth;
        constraints.gridheight = gridheight;
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.insets = new Insets(0, 0, 0, 10);
        layout.removeLayoutComponent(co);
        layout.setConstraints(co, constraints);
        this.add(co);
    }

    public Dimension getMinimumSize() {
        return new Dimension(900, 173);
    }

    public Dimension getPreferredSize() {
        return getMinimumSize();
    }    
}
class Platno extends Canvas {

    public void paint(Graphics g) {
        Dimension d = getSize();
        int sirka = (d.width > d.height) ? d.width : d.height;
        g.setColor(Color.black);
        g.fillRect(0, 0, sirka, sirka);
    }
}
Nahlásit jako SPAM
IP: 213.226.245.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý