Come generare cartesiano di coordinate (x, y) da GridBagLayout?
-
24-09-2019 - |
Domanda
La mia domanda legato al post precedente Come il colore di riempimento in scatole di griglia in modo casuale
Come posso ottenere cartesiano di coordinate (x, y) di ciascuna delle scatole riempite per colore in GridBagLayout. Ad esempio, se la dimensione del pannello è di 300 x 300, e la riga e la colonna è impostata a 5 x 5, C'è un modo sapremo la coordinata e non solo, cercando sulla colonna e riga?
http://www.freeimagehosting.net/image.php?a6ec309bd0.jpg
A CURA: codice 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);
}
}
}
Output: Non ho potuto ottenere la coordinata, tutte le coordinate sembrano lo stesso, java.awt.Rectangle [x = 0, y = 0, = 0 width, height = 0]
Soluzione
Come su:
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);
Nel vostro caso, provate questo al posto di System.out.println:
GridBagConstraints gbc = ((GridBagLayout) getLayout()).getConstraints(component);
System.out.println("box " + i + ",coordinate=" + gbc.gridx + " , " + gbc.gridy);
che funziona per me ...
Se avete bisogno di posizione del componente sullo schermo, assicurarsi che la struttura sia visibile prima. Per esempio, quando io uso questo al posto del tuo main()
, stampa le posizioni correttamente:
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);
}
Funziona in tutti i casi, non solo in WindowListener
. Basta assicurarsi che il telaio è visibile già ...
Altri suggerimenti
È possibile ottenere la posizione della componente aggiunto alla cella
Rectangle bounds = component.getBounds();
O, per passare attraverso l'intera rete si potrebbe usare qualcosa di simile:
Component[] components = panel.getComponents();
for (Component component : components) {
Color color = component.getBackground();
Rectangle bounds = component.getBounds();
}