Dúvida GridBagLayout e Java2D

Olá a todos.

Venho desenvolvendo uma aplicação gráfica de java que envolve uma espécie de tabuleiro, uma matriz de linhas e colunas, mas me deparei com alguns problemas.

Para gerenciar a posição dos componentes, utilizei um GridBagLayout, mas preferi setar manualmente a posição de cada componente inserido, alterando os valores de GridBagConstraints.gridX e GridBagConstraints.gridY. Cada componente inserido é uma instancia de uma classe Tile escrita por mim, que estende JComponent. Os componentes são inseridos como se segue (onde cons é a instancia de GridBagConstraints utilizada):

Tile[][] tiles = Map.getTiles();
for(int row = 0; row < ROWS; row++) {
	for(int col = 0; col < COLS; col++) {
		cons.gridx = col;
		cons.gridy = row;
		this.add(tiles[row][col], cons);
	}
}

Meu primeiro problema se encontra no fato de que o tabuleiro é maior que o painel no qual o desenho. Eu mantenho um componente como sendo o central, e minha ideia é que o mapa acompanhe o movimento do componente central. Cada Tile mantém a informação sobre os seus componentes vizinho, e ao mover o componente central, eu chamo um método para atualizar os componentes do grid, tornando cada componente o seu vizinho, fazendo, no painel que representa o meu mapa:

public void moveMap(int direction) {
		
	Component[] components = this.getComponents();
		
	for(Component component : components) {
		if(component instanceof Tile) {
			Tile neighbour = ((Tile)component).getNeighbour(direction);
			component = neighbour;
		}
	}		
}

Debugando meu código, vejo que a atribuição é feita corretamente. Todavia, ao chamar novamente este método, vejo que as referencias, ou seja, o Tile que cada component representa, não foram modificadas, e com isso o mapa não “anda”.

Meu segundo problema encontra-se no momento de pintar os componentes. Cada Tile possui uma imagem simples de 40 x 40, e ao sobrescrever seu método paintComponent(), mando simplesmente pintar esta imagem. Além disso, faço com que cada célula do GridBagLayout tenha essa dimensão, fazendo:


GridBagConstraints cons = new GridBagConstraints();
cons.insets = new Insets(20,20,20,20);
cons.fill = GridBagConstraints.BOTH;

Contudo, ao chamar o método paintComponents() do meu painel, cada um dos tiles é pintado como um único pixel. As posições dos pixels, no entanto, equivalem à posição correta onde cada Tile deveria ser pintado.

Se alguém puder me esclarecer o que estou fazendo de errado, ficarei grato.

Bernardo

Olá tinadim :smiley:

Com este trecho de código fica difícil :wink: posta como você está sobrescrevendo o método paintComponents();

flw :thumbup: