摆动 wait()/notifyAll()
Swing wait()/notifyAll()
我正在开发一个 Java 应用程序,当按下 GUI 中的按钮时,用户可以单击屏幕上的任意位置以记录他们单击的 x 和 y 坐标。
这是通过在整个屏幕上放置一个未修饰的、部分为 t运行sparent JFrame 来完成的,该 JFrame 侦听鼠标点击,记录 x/y 坐标,然后在被点击时自行关闭。
T运行sparent JFrame class(注意:扩展 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 class" 运行 在主 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.
不要。与大多数 UI 框架一样,Swing 是事件驱动的,这意味着(在某个时间点)发生了某些事情并且您响应它。
相反,只需使用 MouseListener
并监视 mouseClicked
事件。当它发生时,您可以使用 MouseEvent#getLocationOnScreen
方法来确定用户在屏幕上单击的位置。
点击后,应该会向调用者(通过某种观察者模式)报告调用结果。
当然,您可以作弊并简单地使用模式 JDialog
,它将在对话框可见时(安全地)阻止,直到它被关闭(关闭)
我正在开发一个 Java 应用程序,当按下 GUI 中的按钮时,用户可以单击屏幕上的任意位置以记录他们单击的 x 和 y 坐标。
这是通过在整个屏幕上放置一个未修饰的、部分为 t运行sparent JFrame 来完成的,该 JFrame 侦听鼠标点击,记录 x/y 坐标,然后在被点击时自行关闭。
T运行sparent JFrame class(注意:扩展 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 class" 运行 在主 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.
不要。与大多数 UI 框架一样,Swing 是事件驱动的,这意味着(在某个时间点)发生了某些事情并且您响应它。
相反,只需使用 MouseListener
并监视 mouseClicked
事件。当它发生时,您可以使用 MouseEvent#getLocationOnScreen
方法来确定用户在屏幕上单击的位置。
点击后,应该会向调用者(通过某种观察者模式)报告调用结果。
当然,您可以作弊并简单地使用模式 JDialog
,它将在对话框可见时(安全地)阻止,直到它被关闭(关闭)