Java: расположение на экране вместо кадра [duplicate]

Я опоздал с ответом на этот вопрос, но на данный момент нет ни одного разумного ответа, несмотря на то, что это популярный вопрос с высокоподдерживаемыми ответами ....

Лучшая практика: вперед Заголовки заголовков

Как проиллюстрировано заголовком <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 и должна завершиться чисто.


Плохая, но обычная практика: вперед объявить материал в других libs

Произнести - вместо использования заголовка прямого объявления, как описано выше, - код в a.h или a.cc вместо forward-declares class B;:

  • , если a.h или a.cc позже включили b.h: компиляция A завершится с ошибкой после того, как она попадет в противоречивую декларацию / определение B (т. е. вышеуказанное изменение на B сломало A и любое другой c лижет злоупотребление форвардными декларациями, вместо того, чтобы работать прозрачно).
  • в противном случае (если A в конечном итоге не включал b.h - возможно, если A просто хранит / передает Bs с помощью указателя и / или ссылки), инструменты построения, основанные на анализе #include и измененные временные метки файлов, t перестроить A (и его далее зависимый код) после изменения на B, вызывая ошибки во время соединения или времени выполнения. Если B распределяется как загруженная DLL во время выполнения, код в «A» может не отображать символы с разными причинами во время выполнения, которые могут обрабатываться или не обрабатываться достаточно хорошо, чтобы инициировать упорядоченное завершение работы или приемлемую сокращенную функциональность.

Если код А имеет специализированные шаблоны / «признаки» для старого B, они не вступят в силу.

12
задан pipsqueaker117 12 September 2012 в 21:54
поделиться

4 ответа

Из методов 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) {
    }
});

Ссылка :

16
ответ дан David Kroukamp 31 August 2018 в 21:14
поделиться

Взгляните на Component.getMousePosition .

Возвращает позицию указателя мыши в этом координатном пространстве 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, вы можете увидеть мой исходный комментарий ...

Попробуйте использовать MouseEvent.getPoint .

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

public void mouseClicked(final MouseEvent evt) {
  final Point pos = evt.getPoint();
  final int x = pos.x;
  final int y = pos.y;
}
7
ответ дан Community 31 August 2018 в 21:14
поделиться

MouseEvent имеет методы getX () и getY (), которые возвращают позицию относительно исходного компонента.

3
ответ дан Mark 31 August 2018 в 21:14
поделиться

Вы можете добавить 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);
7
ответ дан Pshemo 31 August 2018 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: