我正在开发一个Java应用程序,当按下GUI中的按钮时,用户可以单击屏幕上的任何地方以记录他们单击的x和y坐标。
这是通过在整个屏幕上放置一个未修饰的、部分透明的JFrame来完成的,该JFrame监听鼠标单击,记录x/y坐标,然后在单击时关闭自己。
透明JFrame类(注意:extends 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是一个单线程框架,这意味着任何在事件调度线程上下文中执行的长时间运行或阻塞进程都将阻止框架响应新事件
我的问题是如何使主GUI使用wait()/notifyAll(),以便它在第二个JFrame记录输入时停止。
没有。Swing,像大多数UI框架一样是事件驱动的,这意味着,发生了一些事情(在某个时间点),你对它做出响应。
相反,只需使用MouseListener
并监视mouseClicked
事件。当它发生时,您可以使用MouseEvent#getLocationOnScreen
方法来确定用户在屏幕上单击的位置。
时,这应该向调用者报告调用的结果(通过某种观察者模式)。
当然,您可以欺骗并简单地使用模式JDialog
,它将在对话框可见时(安全地)阻塞,直到它被驳回(关闭)