Итак, я создаю проект, который позволяет вам выбрать часть экрана, чтобы затем работать с этой частью экрана.
Взаимодействие с пользователем в основном:
- Точка отметки 1 (верхний левый угол)
- Точка отметки 2 (внизу слева)
С этими двумя точками я вычисляю прямоугольник. Но чтобы сделать это удобным для пользователя, я попытался нарисовать прямоугольник вокруг того, что пользователь отметил. Я использовал окно клика
public BoundaryRecorder() {
super(null);
this.setVisible(true);
this.pack();
this.setAlwaysOnTop(true);
this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
AWTUtilities.setWindowOpaque(this, false);
WinDef.HWND hwnd = getHWnd(this);
int wl = User32.INSTANCE.GetWindowLong(hwnd, WinUser.GWL_EXSTYLE);
wl = wl | WinUser.WS_EX_LAYERED | WinUser.WS_EX_TRANSPARENT;
User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE, wl);
//mouse listener stuff
}
Проблема в том, что при рисовании прямоугольника впоследствии (с использованием метода перекраски)
@Override
public void nativeMouseClicked(NativeMouseEvent nativeMouseEvent) {
if (this.currentPos == null) {
this.currentPos = new Position();
this.currentPos.x = nativeMouseEvent.getX();
this.currentPos.y = nativeMouseEvent.getY();
} else if (this.currentPos.height == 0 && this.currentPos.width == 0) {
this.currentPos.width = nativeMouseEvent.getX() - this.currentPos.x;
this.currentPos.height = nativeMouseEvent.getY() - this.currentPos.y;
if (this.currentPromise != null) {
this.currentPromise.complete(this.currentPos);
this.repaint();
}
}
}
Новый прямоугольник не будет нарисован. Я отладил его, и вызвали метод рисования, и g.fillRect()
получил правильные координаты, но новый прямоугольник не был нарисован.
Для дальнейшей отладки я создал прямоугольник, который будет увеличивать его размер при каждом вызове метода рисования:
g.fillRect(10, 10, 140, (height += 100));
По умолчанию метод рисования вызывается 2 раза, что делает прямоугольник размером 50 + 100 * 2 = 250
, который работал, но при вставке Thread.sleep(1000)
в конце метода рисования размер прямоугольника уменьшился до 50 + 100 = 150
,
Итак, мой вопрос: что я делаю не так с перекрашиванием принятого прямоугольника? Потому что он вызывает рисунок, но, кажется, не выполняется.
int x = (this.currentPos == null ? 100 : this.currentPos.x);
int y = (this.currentPos == null ? 100 : this.currentPos.y);
int height = (this.currentPos == null ? 100 : this.currentPos.height);
int width = (this.currentPos == null ? 100 : this.currentPos.width);
g.fillRect(x, y, height, width);