Domanda

Questa domanda è legata alla mia domanda precedente Come generare coordinate cartesiane (x, y) da GridBaglayout?

Ho ottenuto con successo la coordinata di ogni foto, tuttavia quando ho controllato la coordinata tramite (System.out.println) e il posizionamento delle immagini sullo schermo, sembra essere sbagliato. Ad esempio, se sullo schermo era ovvio che il punto X della prima immagine è sulla cella 2 che è in coordinata di 20, ma il programma mostra x = 1.

Ecco parte del codice:

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

Ho controllato la coordinata tramite questo codice:

Component[] components = getComponents();     
for (Component component : components) {
   System.out.println(component.getBounds());
}
È stato utile?

Soluzione

Puoi usare SwingUtilities convertPointToScreen() e convertPointFromScreen() Per convertire le coordinate di schermate e componenti.

Addendum: ecco un semplice esempio che ho usato quando cerco di capire come i componenti si muovono e si ridimensionano sotto l'influenza di un gestore di 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 + "]");
                }
            });
        }
    }
}

Altri suggerimenti

Se sullo schermo era ovvio che il punto X della prima immagine è sulla cella 2 che è in coordinata di 20, ma il programma mostra x = 1.

La prima immagine avrà coordinate X/Y di 0/0. Le seconde immagini avranno coordinate di 1/0. I valori X/Y di offset da 0. è quello di cui stai parlando?

Oppure viene aggiunto l'ascoltatore all'immagine, non al pannello, nel qual caso è necessario convertire le coordinate dell'immagine nelle coordinate del pannello. Controlla la nostra classe SwingUlities per fare metodi per farlo.

Se hai bisogno di più aiuto, pubblica il tuo SSCCE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top