Duvida sobre o GridBagLayout

2 respostas
Basilio

Galera eu estou tentando usar o GridBagLayout mas estou com um probelma, as celulas nao tem um numero fixo, por exemplo a celula (0,0) é na verdade (0,2) estou mandando o código pra esclarecer minha duvida

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class InterfaceGrafica extends JFrame {

	protected JPanel painelPrincipal;
	protected Vector<JPanel> casas;
	protected Color cor;
	protected GridBagConstraints cons, ultimoClick;
	

	public InterfaceGrafica() {

		
		casas = new Vector<JPanel>();
		painelPrincipal = new JPanel();
		painelPrincipal.setLayout(new GridBagLayout());
		cons = new GridBagConstraints();
		ultimoClick = new GridBagConstraints();
		cons.weightx = 1;
		cons.weighty = 1;
		cons.fill = GridBagConstraints.BOTH;

		
		
		for (int i = 0; i < 64; i++) {
			casas.add(new JPanel());
			casas.get(i).addMouseListener(new MouseListener() {

				public void mouseEntered(MouseEvent e) {
					cor = e.getComponent().getBackground();
					e.getComponent().setBackground(Color.YELLOW);
				}

				public void mouseExited(MouseEvent e) {
					e.getComponent().setBackground(cor);
				}

				public void mouseClicked(MouseEvent e) {
					ultimoClick.gridx = e.getComponent().getX();
					ultimoClick.gridy = e.getComponent().getY();
					System.out.println("x: " + ultimoClick.gridx + "\ny: "
							+ ultimoClick.gridy);

				}

				public void mousePressed(MouseEvent arg0) {
				}

				public void mouseReleased(MouseEvent arg0) {
				}
			});

			if (((((i < 8) | ((i > 16) & (i < 24)) | ((i > 32) & (i < 40)) | ((i > 48) & (i < 56))) & (i % 2 == 1)))
					| (((((i > 7) & (i < 15)) | ((i > 23) & (i < 31))
							| ((i > 39) & (i < 47)) | (i > 55)) & (i % 2 == 0)))) {
				casas.get(i).setBackground(Color.BLACK);
			} else {
				casas.get(i).setBackground(Color.WHITE);
			}
		}

		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				cons.gridx = j;
				cons.gridy = i;
				painelPrincipal.add(casas.get(i * 8 + j), cons);
			}
		}

		
		
		add(painelPrincipal);
		setSize(400, 400);
		setLocation(300, 150);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);

	}

	public static void main(String[] args) {

		InterfaceGrafica jogo = new InterfaceGrafica();

	}

}

2 Respostas

H
public void mouseClicked(MouseEvent e) {
					ultimoClick.gridx = e.getComponent().getX();
					ultimoClick.gridy = e.getComponent().getY();
					System.out.println("x: " + ultimoClick.gridx + "\ny: "
							+ ultimoClick.gridy);

				}
Ao meu ver o problema está nessa porção de código, bom os métodos getX e getY, até onde observei tem muito haver com o tamanho da janela que você está usando.... dei uns resizes no JFrame e recebi resultados diferentes para a mesma casa clicada...

Bom a minha sugestão seria fazer uma nova classe que seja filha de JPanel...

public class Casa extends javax.swing.JPanel{
    private int x, y;

    public Casa() {
    }

    public void setX(int x){
        this.x = x;
    }
    public void setY(int y){
        this.y = y;
    }
    public int getPosicaoX(){
        return this.x;
    }
    public int getPosicaoY(){
        return this.y;
    }

}

Utilizando Essa nova classe na sua classe main...
temos um código que funciona dentro do que você espera, pelo menos eu acho...

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class InterfaceGrafica extends JFrame {

    protected JPanel painelPrincipal;
    protected Vector<Casa> casas;
    protected Color cor;
    protected GridBagConstraints cons,  ultimoClick;

    public InterfaceGrafica() {


        casas = new Vector<Casa>();
        painelPrincipal = new JPanel();
        painelPrincipal.setLayout(new GridBagLayout());
        cons = new GridBagConstraints();
        ultimoClick = new GridBagConstraints();
        cons.weightx = 1;
        cons.weighty = 1;
        cons.fill = GridBagConstraints.BOTH;



        for (int i = 0; i < 64; i++) {
            casas.add(new Casa());
            casas.get(i).addMouseListener(new MouseListener() {

                public void mouseEntered(MouseEvent e) {
                    cor = e.getComponent().getBackground();
                    e.getComponent().setBackground(Color.YELLOW);
                }

                public void mouseExited(MouseEvent e) {
                    e.getComponent().setBackground(cor);
                }

                public void mouseClicked(MouseEvent e) {
                    Casa casa = (Casa) e.getComponent();
                    ultimoClick.gridx = casa.getPosicaoX();
                    ultimoClick.gridy = casa.getPosicaoY();
                    System.out.println("x: " + ultimoClick.gridx + "\ny: " + ultimoClick.gridy);

                }

                public void mousePressed(MouseEvent arg0) {
                }

                public void mouseReleased(MouseEvent arg0) {
                }
            });

            if (((((i < 8) | ((i > 16) & (i < 24)) | ((i > 32) & (i < 40)) | ((i > 48) & (i < 56))) & (i % 2 == 1))) | (((((i > 7) & (i < 15)) | ((i > 23) & (i < 31)) | ((i > 39) & (i < 47)) | (i > 55)) & (i % 2 == 0)))) {
                casas.get(i).setBackground(Color.BLACK);
            } else {
                casas.get(i).setBackground(Color.WHITE);
            }
        }

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                cons.gridx = j;
                cons.gridy = i;
                painelPrincipal.add(casas.get(i * 8 + j), cons);
                casas.get(i * 8 + j).setX(j);
                casas.get(i * 8 + j).setY(i);

            }
        }



        add(painelPrincipal);
        setSize(400, 400);
        setLocation(300, 150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }

    public static void main(String[] args) {

        InterfaceGrafica jogo = new InterfaceGrafica();

    }
    
}
Basilio

nao deu certo isso nao, mas a ideia de criar uma nova classe deu. VLW

Criado 14 de julho de 2008
Ultima resposta 19 de jul. de 2008
Respostas 2
Participantes 2