gpt4 book ai didi

java - 为什么当循环运行时 MouseListener 不起作用?

转载 作者:行者123 更新时间:2023-12-02 10:04:20 24 4
gpt4 key购买 nike

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

我尝试放置一个循环来停止程序,直到变量为 true,但如果循环正在运行,则 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 确实可以工作,但是它似乎只有在程序处于 hibernate 状态并且已完成 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");
}
}

我预计告诉线程 sleep 的循环也可能有效,但这具有相同的结果,并且无法调用 MouseListener。

因此我想问为什么 MouseListener 在循环运行时无法运行,是否有一种简单的方法可以避免此问题并暂停程序直到 mouseClicked 代码运行。

最佳答案

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

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

关于java - 为什么当循环运行时 MouseListener 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55416355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com