Frage

Diese Frage bezieht sich auf meine vorherige Frage Wie generiere ich kartesische Koordinate (x, y) aus Gridbaglayout?

Ich habe die Koordinate jedes Bilders erfolgreich erhalten, als ich die Koordinate (System.out.println) und die Platzierung der Bilder auf dem Bildschirm durchprüft habe, scheint falsch zu sein. zB auf dem Bildschirm war es offensichtlich, dass der x -Punkt des ersten Bildes auf Zelle 2 liegt, die in der Koordinate von 20 liegt, das Programm jedoch x = 1 zeigt.

Hier ist Teil des Code:

public Grid (){

  setPreferredSize(new Dimension(600,600)); 
  ....
  setLayout(new GridBagLayout());
  GridBagConstraints gc = new GridBagConstraints();
  gc.weightx = 1d; 
  gc.weighty = 1d;
  gc.insets = new Insets(0, 0, 0, 0);//top, left, bottom, and right 
  gc.fill = GridBagConstraints.BOTH; 

  JLabel[][] label = new JLabel[ROWS][COLS];         
  Random rand = new Random();

  // fill the panel with labels
  for (int i=0;i<IMAGES;i++){
    ImageIcon icon = createImageIcon("myPics.jpg");
    int r, c;
    do{   
  //pick random cell which is empty
     r = (int)Math.floor(Math.random() * ROWS);
        c = (int)Math.floor(Math.random() * COLS); 
    } while (label[r][c]!=null);

    //randomly scale the images                
    int x = rand.nextInt(50)+30;
    int y = rand.nextInt(50)+30;                  
    Image image = icon.getImage().getScaledInstance(x,y, Image.SCALE_SMOOTH);
    icon.setImage(image);

    JLabel lbl = new JLabel(icon); // Instantiate GUI components 
    gc.gridx = r;
    gc.gridy = c;         
    add(lbl, gc); //add(component, constraintObj);         
    label[r][c] = lbl; 
}

Ich habe die Koordinate über diesen Code überprüft:

Component[] components = getComponents();     
for (Component component : components) {
   System.out.println(component.getBounds());
}
War es hilfreich?

Lösung

Sie können verwenden SwingUtilities convertPointToScreen() und convertPointFromScreen() Um zwischen Bildschirm- und Komponentenkoordinaten umzuwandeln.

Addendum: Hier ist ein einfaches Beispiel, das ich verwendet habe, um zu verstehen, wie sich die Komponenten unter dem Einfluss eines Layout -Managers bewegen und ändern.

public class MyPanel extends JPanel {

    public MyPanel() {
        super(new GridLayout(4, 4));
        for (int i = 0; i < 16; i++) {
            JPanel panel = new JPanel(new GridLayout());
            panel.add(new CenterLabel());
            this.add(panel);
        }
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }

    private static class CenterLabel extends JLabel {

        public CenterLabel() {
            this.setHorizontalAlignment(JLabel.CENTER);
            this.setVerticalAlignment(JLabel.CENTER);
            this.setOpaque(true);
            this.setBackground(Color.lightGray);
            this.setBorder(BorderFactory.createLineBorder(Color.blue));
            this.setPreferredSize(new Dimension(160, 100));
            this.addComponentListener(new ComponentAdapter() {

                @Override
                public void componentResized(ComponentEvent e) {
                    int w = e.getComponent().getWidth();
                    int h = e.getComponent().getHeight();
                    CenterLabel.this.setText("[" + w/2 + "\u253C" + h/2 + "]");
                }
            });
        }
    }
}

Andere Tipps

Wenn auf dem Bildschirm es offensichtlich war, dass sich der x -Punkt des ersten Bildes in Zelle 2 befindet, die sich in der Koordinate von 20 befindet, das Programm jedoch x = 1 zeigt.

Das erste Bild hat X/Y -Koordinaten von 0/0. Die zweiten Bilder haben Koordinaten von 1/0. Die X/Y -Werte von Offset von 0. Ist das das, worüber Sie sprechen?

Oder wird Ihr Hörer dem Bild hinzugefügt, nicht um das Panel. In diesem Fall müssen Sie die Bildkoordinaten in die Panel -Koordinaten konvertieren. Überprüfen Sie unsere Swingutilities -Klasse, um dies zu tun.

Wenn Sie mehr Hilfe benötigen, um Ihre zu veröffentlichen SSCCE.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top