Pregunta

Los dos ejemplos que se muestran a continuación son los mismos. Se supone que ambos producen el mismo resultado, por ejemplo, generan las coordenadas de las imágenes que se muestran en JPanel. Ejemplo 1, funciona perfectamente (imprima las coordenadas de las imágenes), sin embargo, el ejemplo 2 que regresa 0 para la coordenada.

Me preguntaba por qué porque, he puesto el setVisible (verdadero) después de agregar el panel, en ambos ejemplos. La única diferencia es que el ejemplo 1 utilizado extends JPanel y ejemplo 2 extends JFrame

EJEMPLO 1:

    public class Grid extends JPanel{
       public static void main(String[] args){
          JFrame jf=new JFrame();
          jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
          final Grid grid = new Grid();
          jf.add(grid);
          jf.pack();

          Component[] components = grid.getComponents();        
          for (Component component : components) {
           System.out.println("Coordinate: "+ component.getBounds());       
          }   

          jf.setVisible(true);        
        }
    }

Ejemplo 2:

public class Grid extends JFrame {

  public Grid () {
    setLayout(new GridBagLayout());
    GridBagLayout m = new GridBagLayout();
    Container c = getContentPane();
    c.setLayout (m);
    GridBagConstraints con = new GridBagConstraints();

    //construct the JPanel
    pDraw = new JPanel();
    ...
    m.setConstraints(pDraw, con);
    pDraw.add (new GetCoordinate ()); // call new class to generate the coordinate
    c.add(pDraw);

    pack();
    setVisible(true);
    }

    public static void main(String[] args) {
       new Grid();
    }
   }
¿Fue útil?

Solución

El problema es que en el segundo ejemplo, está tratando de imprimir los límites de un componente antes de que el componente se haya agregado a su contenedor (llamando add()) y antes de que el contenido del marco se haya presentado (llamando pack()).

Aquí está mi intento de reproducir el ejemplo 1. ...

Aquí está mi intento de reproducir el ejemplo 2. Agregué el SwingUtilities llamar para poner las cosas en el hilo correcto, y completé el contenido del GetCoordiates Constructor con ayuda de sus comentarios:

class GetCoordinate extends JLabel {
    public GetCoordinate() {
        setText("Foo!");
        System.out.println("Coordinate: " + this.getBounds());
    }
}

public class Grid extends JFrame {
    public Grid() {
        setLayout(new GridBagLayout());
        GridBagLayout m = new GridBagLayout();
        Container c = getContentPane();
        c.setLayout(m);
        GridBagConstraints con = new GridBagConstraints();

        // construct the JPanel
        final JPanel pDraw = new JPanel();
        m.setConstraints(pDraw, con);
        pDraw.add(new GetCoordinate()); // call new class to generate the
                                        // coordinate
        c.add(pDraw);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Grid();
            }
        });
    }
}

Justo como describió, imprime un tamaño de cero:

Coordinada: java.awt.rectangle [x = 0, y = 0, ancho = 0, altura = 0

Sin embargo, si imprime el tamaño después de que se haya agregado el componente y el marco se haya empaquetado, debería funcionar. Aquí hay una versión modificada de mi ejemplo 2, donde agregué un método GetCoordinate.printBounds() Y llame a ese método, todo ha sido agregado y presentado:

class GetCoordinate extends JLabel {
    public GetCoordinate() {
        setText("Foo!");
        // Let's not try to do this here anymore...
//        System.out.println("Coordinate: " + this.getBounds());
    }

    public void printBounds() // <-- Added this method
    {
        System.out.println("Coordinate: " + this.getBounds());
    }
}

public class Grid extends JFrame {
    public Grid() {
        setLayout(new GridBagLayout());
        GridBagLayout m = new GridBagLayout();
        Container c = getContentPane();
        c.setLayout(m);
        GridBagConstraints con = new GridBagConstraints();

        // construct the JPanel
        final JPanel pDraw = new JPanel();
        m.setConstraints(pDraw, con);
        final GetCoordinate content = new GetCoordinate();
        pDraw.add(content);
        c.add(pDraw);

        pack();
        setVisible(true);
        content.printBounds();  // <-- Added this
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Grid();
            }
        });
    }
}

Con estos cambios, obtengo la siguiente salida de la consola, incluido un tamaño distinto de cero para mi contenido:

Coordinada: java.awt.rectangle [x = 5, y = 5, ancho = 23, altura = 16

Otros consejos

Una causa común de tales anomalías no está comenzando en el EDT. En este caso, no puedo decir desde su código qué es diferente: en particular, no está claro dónde se imprime el segundo ejemplo.

conteo

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author LENOVO G40
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new FrmMenuUTama().setVisible(true);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top