Question

Cette question est liée à ma précédente question Comment générer de coordonnées cartésiennes (x, y) à partir de GridBagLayout?

J'ai réussi à obtenir les coordonnées de chaque images, mais quand j'ai vérifié les coordonnées à (System.out.println) et le placement des images sur l'écran, il semble se tromper. par exemple. si sur l'écran, il est évident que le point x de la première image se trouve sur la cellule 2 qui se trouve sur la coordination de 20, mais le programme affiche x = 1.

Voici une partie du 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; 
}

J'ai vérifié les coordonnées de ce code:

Component[] components = getComponents();     
for (Component component : components) {
   System.out.println(component.getBounds());
}
Était-ce utile?

La solution

Vous pouvez utiliser SwingUtilities convertPointToScreen() et convertPointFromScreen() pour convertir entre des coordonnées d'écran et des composants.

Addendum. Voici un exemple simple je en essayant de comprendre comment les composants déplacer et redimensionner sous l'influence d'un gestionnaire de mise en page

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 + "]");
                }
            });
        }
    }
}

Autres conseils

  

si sur l'écran, il était évident que   le point x de la première image est le   cellule 2 qui est coordonnée 20,   mais le programme montre x = 1.

La première image aura x / y de 0/0. Les deuxièmes images auront les coordonnées de 1/0. Les valeurs X / Y de décalage de 0. Est-ce que vous parlez?

Ou est votre interlocuteur ajouté à l'image non le panneau auquel cas vous devez convertir l'image vers les coordonnées de panneau. Consultez notre classe pour les méthodes SwingUtilities de le faire.

Si vous avez besoin de plus d'aide après votre SSCCE .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top