点击后到达窗口(重新)绘画不起作用

时间:2019-05-26 11:21:23

标签: java window draw

因此,我正在创建一个项目,该项目使您可以选择屏幕的一部分,然后使用该部分屏幕。 用户交互基本上是:

  1. 标记点1(左上角)
  2. 标记点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
}

问题在于,在之后绘制矩形时(使用repaint方法)

 @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();
        }
    }
}

不会绘制新的矩形。我对其进行了调试,然后调用paint方法,并且g.fillRect()收到了正确的坐标,但是新的rect并没有被绘制出来。 为了进一步调试,我然后创建了一个rect,每次调用paint方法时,都会增加它的大小:

 g.fillRect(10, 10, 140, (height += 100));

默认情况下,paint方法被调用2次,这将使大小为50 + 100 * 2 = 250的rect起作用,但是在paint方法的末尾插入Thread.sleep(1000)时,rect的大小减小了到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);

0 个答案:

没有答案