Я опоздал с ответом на этот вопрос, но на данный момент нет ни одного разумного ответа, несмотря на то, что это популярный вопрос с высокоподдерживаемыми ответами ....
Как проиллюстрировано заголовком <iosfwd>
стандартной библиотеки, правильный способ предоставления форвардных объявлений для других должен иметь заголовок forward declare . Например:
a.fwd.h:
#pragma once
class A;
ah:
#pragma once
#include "a.fwd.h"
#include "b.fwd.h"
class A
{
public:
void f(B*);
};
b.fwd.h:
#pragma once
class B;
bh:
#pragma once
#include "b.fwd.h"
#include "a.fwd.h"
class B
{
public:
void f(A*);
};
Составители библиотек A
и B
должны отвечать за сохранение заголовков своих прямых деклараций в соответствии с их заголовками и файлами реализации, поэтому - для Например, если сопровождающий «B» входит и перезаписывает код, который должен быть ...
b.fwd.h:
template <typename T> class Basic_B;
typedef Basic_B<char> B;
bh:
template <typename T>
class Basic_B
{
...class definition...
};
typedef Basic_B<char> B;
... тогда перекомпиляция кода для «А» будет вызвана изменениями к включенному b.fwd.h
и должна завершиться чисто.
Произнести - вместо использования заголовка прямого объявления, как описано выше, - код в a.h
или a.cc
вместо forward-declares class B;
:
a.h
или a.cc
позже включили b.h
: компиляция A завершится с ошибкой после того, как она попадет в противоречивую декларацию / определение B
(т. е. вышеуказанное изменение на B сломало A и любое другой c лижет злоупотребление форвардными декларациями, вместо того, чтобы работать прозрачно). b.h
- возможно, если A просто хранит / передает Bs с помощью указателя и / или ссылки), инструменты построения, основанные на анализе #include
и измененные временные метки файлов, t перестроить A
(и его далее зависимый код) после изменения на B, вызывая ошибки во время соединения или времени выполнения. Если B распределяется как загруженная DLL во время выполнения, код в «A» может не отображать символы с разными причинами во время выполнения, которые могут обрабатываться или не обрабатываться достаточно хорошо, чтобы инициировать упорядоченное завершение работы или приемлемую сокращенную функциональность. Если код А имеет специализированные шаблоны / «признаки» для старого B
, они не вступят в силу.
Из методов MouseListener
вы можете сделать:
@Override
public void mouseClicked(MouseEvent e) {
int x=e.getX();
int y=e.getY();
System.out.println(x+","+y);//these co-ords are relative to the component
}
Просто добавьте это в свой Component
с помощью:
component.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
});
Ссылка :
Взгляните на Component.getMousePosition
.
Возвращает позицию указателя мыши в этом координатном пространстве
blockquote>Component
, еслиComponent
прямо под указателем мыши, в противном случае возвращаетnull
. ЕслиComponent
не отображается на экране, этот метод возвращает значение null, даже если указатель мыши находится выше области, где будет отображатьсяComponent
. ЕслиComponent
частично или полностью закрыт другимиComponent
s или родными окнами, этот метод возвращает значение неnull
, только если указатель мыши расположен над незакрашенной частьюComponent
.final Point mousePos = component.getMousePosition(); if (mousePos != null) { final int mouseX = mousePos.x; final int mouseY = mousePos.y; ... }
... или, если вы используете
MouseListener
, вы можете увидеть мой исходный комментарий ...Попробуйте использовать
blockquote>MouseEvent.getPoint
.Вышеупомянутое вернет точку мыши относительно компонента, к которому был привязан слушатель.
public void mouseClicked(final MouseEvent evt) { final Point pos = evt.getPoint(); final int x = pos.x; final int y = pos.y; }
MouseEvent имеет методы getX () и getY (), которые возвращают позицию относительно исходного компонента.
Вы можете добавить MouseListener
к компоненту GUI, верхний левый пиксель которого должен рассматриваться как [0,0], и получить x и y из MouseEvent
JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.add(panel);
panel.addMouseListener(new MouseAdapter() {// provides empty implementation of all
// MouseListener`s methods, allowing us to
// override only those which interests us
@Override //I override only one method for presentation
public void mousePressed(MouseEvent e) {
System.out.println(e.getX() + "," + e.getY());
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);