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