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

时间:2019-03-29 11:21:22

标签: java graphics2d mouselistener

我正在创建一个Java程序,并希望暂停该程序,直到识别出使用MouseListener的鼠标单击为止。我将如何“暂停”程序(例如使用循环),以使MouseListener仍然可以工作并且程序可以返回相同的方法?

我曾尝试放置一个循环以停止程序,直到变量为真为止,但是如果循环正在运行,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中的所有代码时,它才能工作。

这是运行循环的代码,不起作用。

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不能运行,并且有一种简单的方法来避免此问题并暂停程序,直到运行mouseClicked代码。

1 个答案:

答案 0 :(得分:1)

paintComponent中的循环会阻塞主线程,这就是为什么它不起作用的原因。您不应该在paintComponent中放入这种逻辑。您可能要做的最好的事情是创建一个单独的Thread,以检查repeatLoop。如果reapetLoop变量为false,则可以完成应用程序。

paintComponent方法仅用于在JPanel上绘制。

相关问题