Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/06/2010, 15:24
Exekiel
 
Fecha de Ingreso: febrero-2008
Mensajes: 16
Antigüedad: 16 años, 3 meses
Puntos: 0
JPanel en Java que mantiene relacion de aspecto

Hola!! Veréis, me ha tocado implementar un buscaminas en Java y me he topado con un pequeño contratiempo: Cuando la ventana se crea el tablero tiene un tamaño predeterminado, pero al redimensionarla, el tablero cambia de forma por culpa del Layout.

Se me ocurrió que podía crear una clase que heredara de JPanel y que permitiera a otro JPanel contenido en su interior ser redimensionado dentro del primero, pero manteniendo la relación de aspecto. En un principio lo que me parecio sencillo me ha complicado bastante la vida. Resulta que tengo:

Código:
public class JResizedPanel extends JPanel implements ComponentListener {
    private JPanel subPanel = new JPanel();
    private int height;
    private int width;
    
    public JResizedPanel ( int height, int width ) {
        this.height = height;
        this.width = width;

        setLayout( null );
        
        addComponentListener( this );
        
        add( subPanel );
    }
    
    public void componentResized ( ComponentEvent evt ) {
        int aux1 = getHeight() / height;
        int aux2 = getWidth() / width;
        
        if (aux1 > aux2) {
            tablero.setBounds( (getHeight() - subPanel.getHeight()) / 2, (getWidth() - subPanel.getWidth()) / 2, aux2 * height, aux2 * width );
        }
        else {
            tablero.setBounds( (getHeight() - subPanel.getHeight()) / 2, (getWidth() - subPanel.getWidth()) / 2, aux1 * height, aux1 * width );
        }
    }
    
    public void componentHidden ( ComponentEvent evt ) {
    }
    
    public void componentMoved ( ComponentEvent evt ) {
    }
    
    public void componentShown ( ComponentEvent evt ) {
    }
    
    public void add( Component comp ){
        subPanel.add( comp );
    }
}
Y aunque está sin acabar, para probarlo llega. Le agregue un par de botones y me puse a redimensionar la ventana y sorpresa, no funciona... Resulta que el evento a componentResized SUPUESTAMENTE se genera después de redimensionar la ventana, pero en este caso parece que se genera antes, pues al redimensionar, los botones toman el tamaño que deberían tener antes de redimensionar la ventana. Así si por ejemplo ejecuto el programa, y redimensiono la ventana al doble de su tamaño, los botones no se mueven; pero si luego la devuelvo a su tamaño, los botones crecen hasta el tamaño que deberían haber tenido antes...

Alguna idea de en que me equivoco?? Alguna idea de otra forma de hacerlo?? Muchisimas gracias y un saludo!!!!