Clickthrough Window (пере) краска не работает - PullRequest
0 голосов
/ 26 мая 2019

Итак, я создаю проект, который позволяет вам выбрать часть экрана, чтобы затем работать с этой частью экрана. Взаимодействие с пользователем в основном:

  1. Точка отметки 1 (верхний левый угол)
  2. Точка отметки 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);
...