Как получить координату изображения на jpanel
-
25-09-2019 - |
Вопрос
Этот вопрос связан с моим предыдущим вопросом Как генерировать картезианскую координату (X, Y) из GridBaglayout?
Я успешно получал координату каждых изображений, однако, когда я проверил координату через (System.out.Println) и размещение изображений на экране, кажется, не так. Например, если на экране было очевидно, что точка x первой картины находится на ячейке 2, которая находится на координате 20, но программа показывает x = 1.
Вот часть кода:
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;
}
Я проверил координату через этот код:
Component[] components = getComponents();
for (Component component : components) {
System.out.println(component.getBounds());
}
Решение
Вы можете использовать SwingUtilities
convertPointToScreen()
а также convertPointFromScreen()
Для преобразования между экранами и координатами компонентов.
Приложение: Вот простой пример, который я использовал при попытке понять, как компоненты перемещаются и изменяют размер под воздействием менеджера макета.
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 + "]");
}
});
}
}
}
Другие советы
Если на экране было очевидно, что точка x первой картины находится на ячейке 2, которая находится на координате 20, но программа показывает x = 1.
Первое изображение будет иметь X / Y координаты 0/0. Вторые изображения будут иметь координаты 1/0. Значения смещения X / Y от 0. состоит в том, что вы говорите?
Или ваш слушатель добавлен к изображению, а не панель, в этом случае вам необходимо преобразовать координаты изображения на координаты панели. Проверьте наши класс свинца для методов для этого.
Если вам нужно больше помочь опубликовать свой Соревнование.