Descolocado con Swing

cjs_alarcos
04 de Mayo del 2006
Ante todo saludos, soy nuevo en el Foro y en Java. Hasta ahora me las he ido apañando, pero la programación de GUIs me esta desesperando, xd. Estoy bastante descolocado con como funciona todo esto.

Estoy haciendo un juego de tablero, usando swing, por ahora como JFrame. Tengo dividido este en 2 JPanels uno para las opciones y otro para el tablero. Por ahora mi intencion es que sea resizable.

Hasta ahora me pintaba bien el tablero usando el paintComponent, pero decidí almacenar en un Image el fondo y el tablero pintado que solo se modificase cd cambiase el tamaño del JPanel y aligerar así un poco el paint. Despues de esto cuando lanzaba la aplicacion solo me pintaba las fichas y al resicear la pantalla lo pintaba todo bien, haciendo tambien bien el repaint tras mover una ficha. Al lanzar el juego la salida daba (Los println del codigo) 1 2 3 3 3 3 3 3 3 3 3 3 ... Vamos que ejecutaba muchas veces el paint al iniciar el panel del tablero.

Tras buscar y probar puse un validate (tb revalidate) despues de crear el panel del tablero. La cosa es q en la documentacion solo dice q valida el contenedor y sus subcomponentes y no entiendo q hace pero al menos a veces lo pinta bien a la primera, y otras pasa lo anterior.
juego = new GUITablero();
juego.rvalidate();
panelPrincipal.add(juego,BorderLayout.CENTER);

Esto es parte del código de GUITablero
.....
private Image miImg;
private Graphics2D imgGr;

private int anchoPantalla;
private int altoPantalla;

public GUITablero() {
tablero = new TableroBG();
posicionCasillaSeleccionada = null;
CasillaSeleccionada = false;

altoPantalla = this.getHeight(); //<--0
anchoPantalla = this.getWidth(); //<--0

horizontal = GestorImagenes.getImagen("Horizontal.GIF");
vertical = GestorImagenes.getImagen("Vertical.GIF");
diagonalIz = GestorImagenes.getImagen("DiagonalIz.GIF");
diagonalDe = GestorImagenes.getImagen("DiagonalDe.GIF");
fondo = GestorImagenes.getImagen("fondo.jpg");

addMouseListener(this);
//add(new Prueba());
}


Este es el paintComponent de GUITablero:

public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (anchoPantalla != this.getWidth() || altoPantalla != this.getHeight
()) {
anchoPantalla = this.getWidth();
altoPantalla = this.getHeight();
miImg = createImage(anchoPantalla,altoPantalla);
imgGr = (Graphics2D) miImg.getGraphics();

if (altoPantalla<=anchoPantalla) {
dimensionCasilla = altoPantalla/7;
origenX = (anchoPantalla/2) - (dimensionCasilla*2);
origenY = (dimensionCasilla*3)/2;
} else {
dimensionCasilla = anchoPantalla/7;
origenX = (dimensionCasilla*3)/2;
origenY = (altoPantalla/2) - (dimensionCasilla*2);
}
dimensionFicha = (dimensionCasilla*2)/3;
System.out.println("1");
imgGr.drawImage(fondo,0,
0,anchoPantalla,altoPantalla,this);
pintarLineas(imgGr);
System.out.println("2");
}

System.out.println("3");
g2.drawImage(miImg,0,0,anchoPantalla,altoPantalla,this);
pintarFicha(g2);
}

Quería preguntar si sabeis porque ocurre esto, cuando no usaba miImg si funcionaba bien. Xq para que lo pinte bien tengo que hacer un resize? Segun la salida la primera vez que se llama al paint inicializa las variable y pasa por los puntos 1 y 2.

Sacando
imgGr.drawImage(fondo,0,
0,anchoPantalla,altoPantalla,this);
pintarLineas(imgGr);
fuera del if y pintando las fichas en el imgGr sigue pasando lo mismo.

Otra duda que tengo es q haciendo
miImg = createImage(400,400);
imgGr = (Graphics2D) miImg.getGraphics();
en el constructor de GUITablero me daba un nullPointerException en el getGraphics. ¿Si esta creada la imagen xq da dicha excepcion?

Otra idea que tenia era pintar las fichas en un Canvas, bueno ese era el siguiente paso que quería dar. Aun no lo he mirado, pero quería preguntar si se podría hacer, tner el Canvas como una segunda capa, transparente, centrado en el panel del tablero que se encargase de pintar las fichas unicamente. Se podría pintar transparente? o valdría directamente con setOpaque. y cd redimendionase el Canvas desde el GUITablero tendria efecto inmediato?

Gracias.

Dactyl
04 de Mayo del 2006
Que es lo que quieres que cambie de tamaño, la ventana o cada panel????
Si es cada panel puedes usar un SplitPane...