为什么 MouseListener 在循环 运行 时不起作用?

Why does a MouseListener not function whilst a loop is running?

我正在创建一个 java 程序并想暂停该程序,直到识别出使用 MouseListener 的鼠标单击。我将如何 'pause' 程序,例如使用循环,使 MouseListener 仍然有效并且程序可以 return 使用相同的方法?

我试过放置一个循环来停止程序,直到变量为真,但是如果循环是 运行ning,MouseListener 将无法工作。

我还尝试将我的其余代码放在 mouseClicked 方法中,或 运行从 mouseClicked 中使用新方法,但是出现了另一个错误,因为我无法在除 paintComponent 之外的任何地方使用 Graphics g,因为这就是为什么在我看来需要循环才能暂停程序的原因。

这是我创建的一个简化程序,用于显示问题的核心。 (不是完整代码)。

class Surface extends JPanel implements MouseListener{
    @Override
    public void mouseClicked(MouseEvent arg0) { 
        //Some way to unpause program
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawLine(30, 30, 200, 30);
        //The program needs to 'pause' here until a click is identified.
        System.out.println("Program finishes here");
    }    
}

MouseListener 确实有效,但它似乎只有在程序处于休眠状态并且已完成 paintComponent 中的所有代码时才有效。

这是不起作用的代码,因为循环是 运行ning.

class Surface extends JPanel implements MouseListener{
    public static boolean repeatLoop = true;

    @Override
    public void mouseClicked(MouseEvent arg0) { 
        repeatLoop = false;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawLine(30, 30, 200, 30);

        while (repeatLoop) {

        }

        System.out.println("Program finishes here");
    }    
}

我原以为告诉线程休眠的循环也可能有效,但这具有相同的结果并且无法调用 MouseListener。

因此我想问为什么 MouseListener 在循环 运行ning 时不能运行,有没有简单的方法来避免这个问题并暂停程序直到 mouseClicked 代码为 运行 .

paintComponent 中的循环阻塞了主线程,这就是它不起作用的原因。你不应该把那种逻辑放在 paintComponent 中。您可以做的最好的事情是创建一个单独的线程来检查 repeatLoop。如果 reapetLoop 变量变为假,您可以完成应用程序。

paintComponent 方法只是为了在 JPanel 上绘制。