Comment obtenir une image coordonnée sur JPanel
-
25-09-2019 - |
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());
}
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 .