Frage

Meine Frage an früheren Post im Zusammenhang Wie Farbe in Gitterboxen zufällig

füllen

Wie kann ich cartesianischen (x, y) Koordinaten erhalten von jedem der durch Farbe in GridBagLayout gefüllten Kästen. wenn die Größe der Platte ist beispielsweise 300 x 300, und die Zeile und Spalte wird auf 5 x 5, Gibt es eine Möglichkeit werden wir wissen, die Koordinierung und nicht nur durch die auf der Spalte und Zeile suchen?

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

EDITED: alle Code

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);
        }       
    }
}

Ausgabe: Ich konnte nicht die Koordinate erhalten, alle Koordinaten scheinen die gleichen, java.awt.Rectangle [x = 0, y = 0, Breite = 0, height = 0]

War es hilfreich?

Lösung

Wie wäre:

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);

In Ihrem Fall, versuchen Sie dies anstelle von System.out.println:

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

Das funktioniert für mich ...

Wenn Sie auf die Komponente Position auf dem Bildschirm benötigen, stellen Sie sicher, dass der Rahmen zunächst sichtbar ist. Zum Beispiel, wenn ich das anstelle Ihres main() verwenden, druckt er die Positionen richtig:

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);
}

Es funktioniert in allen Fällen nicht nur in einem WindowListener. So stellen Sie sicher, dass der Rahmen ist sichtbar schon ...

Andere Tipps

Sie können die Position von der Komponente erhalten hinzugefügt, um die Zelle

Rectangle bounds = component.getBounds();

oder auf das gesamte Netz durchlaufen Sie so etwas wie diese verwenden:

Component[] components = panel.getComponents();
for (Component component : components) {
    Color color = component.getBackground();
    Rectangle bounds = component.getBounds();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top