Pregunta

Mi pregunta relacionada con la anterior entrada Cómo llenar de color en cajas de la red al azar

¿Cómo puedo obtener coordenadas cartesianas (x, y) de cada una de las cajas llenas de color en la GridBagLayout. Por ejemplo, si el tamaño del panel es de 300 x 300, y la fila y la columna se establece en 5 x 5, ¿Hay alguna manera vamos a conocer la coordenada y no sólo mirando en la columna y la fila?

http://www.freeimagehosting.net/image.php?a6ec309bd0.jpg

Editado: código completo

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Grid extends JPanel{

    public static void main(String[] args){
        JFrame jf=new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(new Grid());
        jf.pack();
        jf.setVisible(true);
    }

    public Grid (){
        setPreferredSize(new Dimension(300,300)); 
        setBackground(Color.BLACK);

        final Color BACKGROUND = Color.WHITE;  
        final Color[] colors = new Color[]
             {Color.BLACK, Color.CYAN, Color.MAGENTA, Color.YELLOW,
              Color.GREEN, Color.RED, Color.ORANGE, Color.BLUE, Color.PINK, Color.LIGHT_GRAY};

        final int ROWS = 5;
        final int COLS = 5;

        setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();
        gc.weightx = 1d;
        gc.weighty = 1d;
        gc.insets = new Insets(0, 0, 1, 1);
        gc.fill = GridBagConstraints.BOTH;     

        // fill the whole panel with labels
        Label[][] label = new Label[ROWS][COLS]; 
        for( int r=0 ; r<ROWS ; r++) {
            for( int c=0 ; c<COLS ; c++) {
                Label lbl = new Label();
                lbl.setBackground(BACKGROUND);    
                gc.gridx = r;
                gc.gridy = c;
                add(lbl, gc); //add(component, constraintObj);
                label[r][c] = lbl;             
            }
        }

        // now find random fields for the colors defined in BACKGROUND
        for(Color col : colors) {
            int r, c;
            do { // make sure to find unique fields
                r = (int)Math.floor(Math.random() * ROWS);
                c = (int)Math.floor(Math.random() * COLS);
            } while(!label[r][c].getBackground().equals(BACKGROUND));
            label[r][c].setBackground(col);  
        }// end 

        int i=0;
        Component[] components = getComponents();       
        for (Component component : components) {
            i++;
            Color color = component.getBackground();
            Rectangle bounds = component.getBounds();
            System.out.println("box "+i +",coordinate= "+bounds +", Color= "+color);
        }       
    }
}

Salida: No pude conseguir la coordenada, todas las coordenadas parecen el mismo, java.awt.Rectangle [x = 0, y = 0, width = 0, altura = 0]

¿Fue útil?

Solución

¿Qué hay de:

GridBagLayout lay = new GridBagLayout(); 
setLayout(lay);
// Add components
add(comp1, constraints);
add(comp2, constraints);
//
GridBagConstraints c = lay.getConstraints(comp1);
System.out.println(c.gridx + ", " + c.gridy);

En su caso, intente esto en lugar de System.out.println:

GridBagConstraints gbc = ((GridBagLayout) getLayout()).getConstraints(component);
System.out.println("box " + i + ",coordinate=" + gbc.gridx + " , " + gbc.gridy);

que funciona para mí ...

Si necesita la posición del componente en la pantalla, asegúrese de que el marco es visible en primer lugar. Por ejemplo, cuando se utiliza esta vez de su main(), imprime las posiciones correctamente:

public static void main(String[] args) {
    final JFrame jf = new JFrame();
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final Grid grid = new Grid();
    jf.add(grid);
    jf.pack();
    jf.addWindowListener(new WindowAdapter() {
        public void windowActivated(WindowEvent e) {
            int i = 0;
            Component[] components = grid.getComponents();
            for (Component component : components) {
                i++;
                Color color = component.getBackground();
                Rectangle bounds = component.getBounds();
                System.out.println("box " + i + ",coordinate= " + bounds
                        + ", Color= " + color);
            }
        }
    });
    jf.setVisible(true);
}

Funciona en todos los casos, no sólo en un WindowListener. Sólo asegúrese de que el marco es visible ya ...

Otros consejos

Se puede obtener la ubicación del componente añadido a la celda

Rectangle bounds = component.getBounds();

O para ir a través de toda la red podría utilizar algo como esto:

Component[] components = panel.getComponents();
for (Component component : components) {
    Color color = component.getBackground();
    Rectangle bounds = component.getBounds();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top