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);
}
}