因此,我正在创建一个项目,该项目使您可以选择屏幕的一部分,然后使用该部分屏幕。 用户交互基本上是:
然后用这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);