2010-03-07 6 views
0

Cette question est liée à ma précédente question How to generate Cartesian Coordinate (x,y) from GridBaglayout?Comment obtenir des coordonnées de l'image sur JPanel

j'obtenir avec succès les coordonnées de chaque photo, mais quand j'ai vérifié les coordonnées à (System.out.println) et le placement des images sur l'écran, il semble être faux. par exemple. si sur l'écran il était évident que le point x de la première image est sur la cellule 2 qui est sur la coordonnée de 20, mais le programme montre 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()); 
} 

Répondre

1

Vous pouvez utiliser SwingUtilitiesconvertPointToScreen() et convertPointFromScreen() pour convertir entre l'écran et les coordonnées du composant.

Addendum: Voici un exemple simple que j'ai utilisé pour essayer de comprendre comment les composants se déplacent et se redimensionnent sous l'influence d'un gestionnaire de disposition.

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

Merci ... dans mon cas, je suppose que le gridbagconstraint ... Je voulais que la coordonnée suive la coordonnée JPanel et pas tout l'écran, donc je l'ai revérifié, je l'ai corrigé en changeant gc.fill = GridBagConstraints. AUCUN au lieu de BOTH – Jessy

1

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

La première image aura des coordonnées x/y de 0/0. Les secondes images auront les coordonnées de 1/0. Les valeurs X/Y du décalage de 0. Est-ce cela dont vous parlez?

Ou est-ce que votre écouteur est ajouté à l'image et non au panneau, auquel cas vous devez convertir les coordonnées de l'image en coordonnées du panneau. Consultez notre classe SwingUtilities pour les méthodes pour cela. Si vous avez besoin de plus d'aide, envoyez votre SSCCE.

Questions connexes