gpt4 book ai didi

java - Swing wait()/notifyAll()

转载 作者:行者123 更新时间:2023-12-01 18:14:13 26 4
gpt4 key购买 nike

我正在开发一个Java应用程序,当按下GUI中的按钮时,用户可以单击屏幕上的任意位置来记录他们单击的位置的x和y坐标。

这是通过以下方式完成的在整个屏幕上放置一个未修饰的、部分透明的 JFrame,用于监听鼠标单击,记录 x/y 坐标,然后在单击时自行关闭。

透明JFrame类(注意:扩展JFrame)

setUndecorated(true);
setOpacity((float) 0.75);
W = Toolkit.getDefaultToolkit().getScreenSize().width;
H = Toolkit.getDefaultToolkit().getScreenSize().height;
setSize(W,H);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
X = e.getX();
Y = e.getY();
System.out.println(X + ":" + Y);
closed = true;
dispose();
}
});
}

public void start() {
java.awt.EventQueue.invokeLater(() -> {
this.setVisible(true);
});
}

public boolean closed = false;
public int X = -1;
public int Y = -1;

按下按钮的方法(注意:扩展JFrame)

    setVisible(false);
click_frame.start();
while(!click_frame.closed) {

}
setVisible(true);
System.out.println(click_frame.X + "," + click_frame.Y);

我遇到的问题是 while 循环挂起整个应用程序而不仅仅是主 GUI。我想使用wait()和notifyAll(),因为我试图故意挂起主GUI,直到click_frame.X和click_frame.Y有值。

当我尝试其他没有 while 循环的方法时,“click_frame JFrame 类”与主 GUI 一起运行,而不是阻止它,这不是我想要发生的情况。

我的问题是如何让主 GUI 使用 wait()/notifyAll(),以便在第二个 JFrame 记录输入时它将停止。

最佳答案

Swing 是一个单线程框架,这意味着在事件调度线程的上下文中执行的任何长时间运行或阻塞的进程都将阻止框架响应新事件

My question is how can I make the main GUI use wait()/notifyAll() so it will stop while the second JFrame records the input.

不要。 Swing 与大多数 UI 框架一样是事件驱动的,这意味着,某些事情发生(在某个时间点)并且您对其做出响应。

相反,只需使用 MouseListener 并监视 mouseClicked 事件即可。当发生这种情况时,您可以使用 MouseEvent#getLocationOnScreen方法来确定用户单击屏幕上的位置。

单击后,应该向调用者报告(通过某种观察者模式)调用结果。

当然,您可以作弊并简单地使用模式JDialog,它将在对话框可见时(安全地)阻塞,直到它被解除(关闭)

关于java - Swing wait()/notifyAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com