Pergunta

Esta pergunta está relacionada à minha pergunta anterior Como gerar coordenadas cartesianas (x, y) a partir de gridbaglayout?

Eu obtive com sucesso a coordenada de cada imagens, no entanto, quando verifiquei a coordenada (System.out.println) e a colocação das imagens na tela, parece estar errado. Por exemplo, se na tela era óbvio que o ponto X da primeira foto está na célula 2, que está na coordenada de 20, mas o programa mostra x = 1.

Aqui faz parte do código:

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

Eu verifiquei a coordenada através deste código:

Component[] components = getComponents();     
for (Component component : components) {
   System.out.println(component.getBounds());
}
Foi útil?

Solução

Você pode usar SwingUtilities convertPointToScreen() e convertPointFromScreen() Para converter entre as coordenadas da tela e do componente.

Adendo: Aqui está um exemplo simples que usei ao tentar entender como os componentes se movem e redimensionam sob a influência de um gerente de layout.

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

Outras dicas

Se na tela era óbvio que o ponto X da primeira foto está na célula 2, que está na coordenada de 20, mas o programa mostra x = 1.

A primeira imagem terá coordenadas X/Y de 0/0. As segundas imagens terão coordenadas de 1/0. Os valores X/Y de compensação de 0. É disso que você está falando?

Ou o seu ouvinte é adicionado à imagem, não ao painel, caso em que você precisa converter as coordenadas da imagem nas coordenadas do painel. Verifique nossa classe Swingutities para obter métodos para fazer isso.

Se você precisar de mais ajuda postar seu Sscce.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top