摆动 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,它将在对话框可见时(安全地)阻止,直到它被关闭(关闭)