كيفية توليد الإحداثيات الديكارتية (x ، y) من Gridbaglayout؟

StackOverflow https://stackoverflow.com/questions/2376027

سؤال

سؤالي المتعلق بالوظيفة السابقةكيفية ملء اللون في صناديق الشبكة بشكل عشوائي

كيف يمكنني الحصول على إحداثيات ديكارتية (x ، y) لكل من الصناديق المملوءة باللون في غلاف الشبكية. على سبيل المثال ، إذا كان حجم اللوحة 300 × 300 ، وتم تعيين الصف والعمود على 5 × 5 ، هل هناك أي طريقة سنعرف الإحداثي وليس فقط من خلال النظر في العمود والصف؟

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

تحرير: رمز كامل

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

الإخراج: لم أستطع الحصول على الإحداثيات ، تبدو جميع الإحداثيات كما هي ، java.awt.Rectangle [x = 0 ، y = 0 ، width = 0 ، height = 0

هل كانت مفيدة؟

المحلول

ماذا عن:

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

في حالتك ، جرب هذا بدلاً من system.out.println:

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

هذا يناسبني ...

إذا كنت بحاجة إلى موضع المكون على الشاشة ، فتأكد من أن الإطار مرئي أولاً. على سبيل المثال ، عندما أستخدم هذا بدلاً من main(), ، يطبع المواضع بشكل صحيح:

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

إنه يعمل في جميع الحالات ، ليس فقط في WindowListener. فقط تأكد من أن الإطار مرئي بالفعل ...

نصائح أخرى

يمكنك إضافة الموقع من المكون إلى الخلية

Rectangle bounds = component.getBounds();

أو للذهاب عبر الشبكة بأكملها ، يمكنك استخدام شيء مثل هذا:

Component[] components = panel.getComponents();
for (Component component : components) {
    Color color = component.getBackground();
    Rectangle bounds = component.getBounds();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top