¿Cómo generar coordenadas cartesianas (x, y) de GridBagLayout?
-
24-09-2019 - |
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]
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();
}