Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Отследить координату мыши относительно компонента

19.12.2013, 04:08. Показов 2414. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть необходимость рисовать по картинке отображаемой в JLabel, соответственно эта картинка в JLabel за счёт компоновщика может съехать куда угодно от верхнего угла, например в центр, но почему-то события по прежнему приходят с координатами относительно окна (а я то думал если зарегистрирую их от лица компонента то буду получать лишь когда это будет непосредственно его касаться).
Как же мне получить актуальные для меня координаты ... ну или может можно как-то получать кордианты верхнего угла компонента чтобы вычитать их из полученных координат от событий мыши.

Мой набросок кода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class PaintLabel extends JLabel {
    private Graphics2D imageGraphics;
 
    public PaintLabel(Image image) {
        super(new ImageIcon(image));
        imageGraphics = (Graphics2D) image.getGraphics();
        imageGraphics.setColor(Color.blue);
        imageGraphics.setStroke(new BasicStroke(5));
 
        MousePaintAction mAction = new MousePaintAction();
        addMouseMotionListener(mAction);
        addMouseListener(mAction);
    }
 
 
    class MousePaintAction extends MouseAdapter {
        Point lastPos;
 
        @Override
        public void mousePressed(MouseEvent e) {
            lastPos = e.getPoint();
        }
 
        @Override
        public void mouseDragged(MouseEvent e) {
            Point newPos = e.getPoint();
            imageGraphics.drawLine(lastPos.x, lastPos.y, newPos.x, newPos.y);
            lastPos = newPos;
            repaint();
            System.out.println(lastPos);
        }
    }
}
Добавлено через 5 минут
Нашёл что есть некий getLocation(), но почему-то он всегда у меня возвращает ноль ... почему такое может быть ?
Делаю так:
Java
1
2
3
4
5
6
7
8
9
        @Override
        public void mouseDragged(MouseEvent e) {
            Point location = getLocation();
            Point newPos = new Point(e.getX() - location.x, e.getY() - location.y);
            imageGraphics.drawLine(lastPos.x, lastPos.y, newPos.x, newPos.y);
            lastPos = newPos;
            repaint();
            System.out.println(lastPos);
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2013, 04:08
Ответы с готовыми решениями:

Как отследить двойной клик мыши на заголовках колонок таблицы JTable?
Здравствуйте! Подскажите пожалуйста, как отследить двойной клик мыши на заголовках колонок таблицы JTable

Получение Координат мыши относительно экрана
Подскажите как можно получить координаты мыши относительно экрана. Допустим я нажал на кнопку, а мне в консоль пишет координаты!!!

TChart, как отследить координату начала горизонтальной оси при панорамировании
Всем здравствуйте. При разрешённом режиме AllowPanning = pmHorizontal мы можем двигать картинку удерживая правую кнопку мыши. Как...

6
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
19.12.2013, 14:23
а зачем вам координаты лебла, вы же можете рисовать на картинке и потом подсовывать её лейблу?
0
28 / 28 / 10
Регистрация: 24.05.2013
Сообщений: 157
20.12.2013, 00:07
Я может быть не то скажу сейчас, но если правильно понял вопрос, то скину пару методов из своего проекта (пару часов назад только сидел думал над этим) :

Здесь я рисую картинку, загруженную с комп. bMenuX b bMenuY - коородинаты начала изображения. bMenuWidth и MenuHeight - размеры изображения

Это изображение - рисунок кнопки, сделанный в photoshop. Следовательно, мне из нее нужно сделать подобие кнопки.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void createBuffer() {
            buffer = new BufferedImage(getWidth(), getHeight(),
                    BufferedImage.TYPE_INT_BGR);
            bMenuX = this.getWidth() / 2 - bMenuWidth / 2;
            bMenuY = this.getHeight() / 2 - 50;
            Graphics2D graphics2D = buffer.createGraphics();
            try {
                image1 = ImageIO.read(new File("buttonMenu.png"));
            } catch (Exception exp) {
                exp.printStackTrace();
            }
            graphics2D.drawImage(image1, bMenuX, bMenuY, bMenuWidth,
                    bMenuHeight, this);
        }
Для этого - метод missesInHelp определяет, входит ли курсор мыши в область, в которой отрисована картинка и возвращает соответственно true - если да, false - если нет

Java
1
2
3
4
5
6
7
8
9
10
11
private boolean missesInHelp(double x0, double y0) {
        double x1 = bMenuX;
        double y1 = bMenuY;
        double x3 = bMenuX + bMenuWidth;
        double y3 = bMenuY + bMenuHeight;
        if ((x0 > x1) & (y0 > y1) & (x0 < x3) & (y0 < y3))
            return true;
        else
            return false;
 
    }
Если метод missesInHelp возвращает значение true, то выполняем дальнейшие действия (у меня происходит расстягивание изображения)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private boolean permit = true;
    MouseMotionAdapter bMenuMove = new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent e) {
 
            if (permit) {
                if (missesInHelp(e.getX(), e.getY())) {
                    x = e.getX();
                    y = e.getY();
                    bMenuWidth = 80;
                    bMenuHeight = 80;
                    repaint();
                    permit = false;
                }
            } else if (missesInHelp(e.getX(), e.getY()) == false) {
                x = 0;
                y = 0;
                bMenuWidth = 60;
                bMenuHeight = 60;
                repaint();
                permit = true;
            }
        };
    };
При других событиях - выполняются др. действия (пример приводить не буду уж).

Или я не правильно понял вопрос?)
1
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.12.2013, 02:00
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
/**
 * @author mutagen
 */
public class ImageWriter {
 
    private BufferedImage bufferedImage;
 
    public BufferedImage getBufferedImage() {
        return bufferedImage;
    }
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        URL img = new URL("http://www.wallng.com/images/2013/08/image-explosion-colors-background-beautiful-263613.jpg");
        Point p = new Point(200, 200);
        ImageWriter imageWriter = new ImageWriter();
        System.out.println("loaded " + imageWriter.loadImage(img));
        imageWriter.writeOnImage(p, "HelloWord");
        BufferedImage bufferedImage = imageWriter.getBufferedImage();
        JFrame jf = new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ImageIcon icon = new ImageIcon(bufferedImage);
        JLabel lbl = new JLabel("", icon, JLabel.CENTER);
        jf.getContentPane().add(lbl);
        jf.pack();
        jf.setVisible(true);
    }
 
    public boolean loadImage(URL url) {
        try {
            bufferedImage = ImageIO.read(url);
            return true;
        } catch (IOException ex) {
            return false;
        }
    }
 
    public void writeOnImage(Point point, String text) {
        Graphics2D graphics = bufferedImage.createGraphics();
        graphics.setColor(Color.WHITE);
        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        graphics.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 80));
        graphics.drawString(text, point.x, point.y);
        
    }
 
}
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
20.12.2013, 02:59  [ТС]
mutagen, рисовать значит рисовать, а не вывести один раз что-то там
Нашёл одну штуку: всё зависит от того какой я использую менеджер расположения, например если у фрейма использовать FlowLayout и просто запихнуть мою лейбл то всё будет ок - лейбл будет получать координаты относительно своего верха и всё, а вот если запихнуть лейбл и у родительского фрейма стоит BorderLayout то получать будем уже совсем не те координаты что планировалось ... получается BorderLayout незаметно (для меня) растягивает JLabel до таких размеров чтобы он заполнял всю область и ему пофиг что я пытался переопределить методы MaxSize и т.д чтобы они отдавали размеры моей картинки ? Но что от jlabel он тогда растянул, я не понимаю, у меня же мой jlabel получился как картинка ...
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.12.2013, 12:56
Цитата Сообщение от Gepar Посмотреть сообщение
mutagen, рисовать значит рисовать, а не вывести один раз что-то там
рисовать значит с какой либо частотой выводить на экран накапливая изменения если это будет 100 кадров в секунду, вы даже мерцания не заметите )))
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
20.12.2013, 13:53
Цитата Сообщение от Gepar Посмотреть сообщение
получается BorderLayout незаметно (для меня) растягивает JLabel до таких размеров чтобы он заполнял всю область и ему пофиг что я пытался переопределить методы MaxSize и т.д чтобы они отдавали размеры моей картинки ?
Так работает BorderLayout. Это написано в документации и еще много где. Например, тут:
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2013, 13:53
Помогаю со студенческими работами здесь

Эмуляция клика мыши в координату
Программа эмулирует нажатия мыши. С кликом в текущие координаты курсора справляется, а если сохранить координаты в переменную и эмулировать...

Менять координату при движении мыши
Я до этого работал только в AS2 и там при движении мыши по оси Х координата менялась таким образом: var mouseL: Object = new Object();...

Как показать координату при наведении мыши на график
Приветствую всех знатоков lazarus! У меня построен график в chart - ChartLineSeries. Как сделать так, чтобы при наведении мыши на...

Вывести поточные координаты курсора мыши относительно формы и экрана, при нажатии на кнопку-реверсное изменение кнопок мыши C++
доброй ночи, уважаемые программисты, умные школьники, преуспевающие студенты, а также все участники этого форума. помогите, пожалуйста,...

Отследить нажатие на вертикальный ScrollBar компонента ListBox
Здравствуйте!! Подскажите пожалуйста, как можно отследить прокрутку и нажатие на вертикальный ScrollBar компонента ListBox. Заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru