Получение координат X и Y мыши при нажатии на изображение в JLabel - PullRequest
1 голос
/ 22 сентября 2011

У меня есть изображение, отображаемое внутри JLabel с использованием функции ImageIcon.

JLabel содержится внутри JPanel.

При нажатии на изображение я хочу получить положение мыши относительно изображения.

Я пытаюсь решить эту проблемудобавив слушатель мыши к JLabel, который содержит изображение.

Очевидно, даже если я установлю размер JLabel с шириной и высотой изображения, кажется, что JLabel автоматически растягивается до размера JPanel.

Таким образом, при выполнении кода ниже, если размер изображения меньше, чем JPanel, получение позиции X и Y возвращает нежелательное значение.

Есть ли способ, которым я могу специально ограничить размерJLabel так, чтобы получить положение X и Y позиции мыши будет хорошо работать?

Или лучший способ получить положение мыши относительно изображения?(что было бы лучше)

    ImageIcon icon = new ImageIcon(image);

    JLabel imageLabel = new JLabel(icon);
    imageLabel.setSize(image.getWidth(null), image.getHeight(null));

    imageLabel.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JOptionPane.showMessageDialog(imageLabel, e.getX()+" "+e.getY());
        }
    });

    imageLabel.validate();
    panel.add(imageLabel);
    panel.validate();

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Все дело в макете.

image

См. этот пример для изображения выше.


Казалось бы, этот сценарий использования требует GridBagLayout или BoxLayout.

1 голос
/ 22 сентября 2011

it seems that JLabel automatically stretches out to the size of JPanel.

проблема здесь

imageLabel.setSize(image.getWidth(null), image.getHeight(null));

если есть только один JLabel, то

myPanel.setLayout(new BorderLayout());//JPanel has by default FlowLayout
myPanel.add(myLabel, BorderLayout.CENTER)

, если есть больше, чем один JLabel с Image / IconImage, и лучше поискать GridLayout

EDIT

во всех случаях (для реальной картины) перед чем-либо

1) Вы должны определить соотношение сторон 3: 2, 4: 3 16:10 ..., затем определить CropRatio:

  • setPreferredSize (новое измерение (x / cropRatio, y / cropRatio)) для JLabel

  • с использованием paintComponent g2d.fillRect (0, 0, x / cropRatio, y / cropRatio);

2) поместите JLabel в JScrollPane , но тогда останется оригинальное количество пикселей

1 голос
/ 22 сентября 2011

Вы, вероятно, видите проблемы, потому что менеджер раскладки контролирует размер вашей метки, а не вызов setSize ().

Я бы, вероятно, создал свой производный класс JPanel (вместо JLabel), который реализуетPaintComponent путем рисования изображения.Затем я переопределил бы getPreferredSize () и getMaximumSize () из JPanel, чтобы вернуть размеры изображения.

Использование метки вызовет проблемы, потому что будут отступы, смещения и тому подобное.

0 голосов
/ 22 сентября 2011

Вы, вероятно, видите проблемы, потому что менеджер раскладки контролирует размер вашей метки, а не вызов setSize ().

Я бы, вероятно, создал свой производный класс JPanel (вместо JLabel), который реализует paintComponent путем рисования изображения. Затем я переопределил бы getPreferredSize () и getMaximumSize () из JPanel, чтобы вернуть размеры изображения.

Использование метки вызовет проблемы, потому что там будут отступы и тому подобное.

Но, в конце концов, то, что заставляет наш лейбл расширяться, это менеджер макетов. Наиболее простой способ сделать то, что вы хотите, - убедиться, что ваш менеджер макета не расширяет метку, выбрав менеджер макета, который поддерживает компонент в его предпочтительном размере.

...