在 Java 中,如何防止图形小程序多次 运行?

In Java, how do I prevent Graphics Applets from running multiple times?

我正在尝试编写一个绘制分形的简单程序,并编写了以下代码。我 运行 测试它是否有效,发现它每次 运行 两次。我寻找答案,发现它可能与图形 window 重新绘制和重新 运行 整个代码有关。在我看到的其他问题中,似乎没有人关心多次编写代码 not 运行,而是 why 它是这样做,结果没有提供任何补救措施。但是,由于我使用的是扫描仪,因此重复使用程序 运行 非常不方便,我主要关心的是只使它 运行 一次。

import java.awt.*;
import java.applet.*;
import java.util.Scanner;
public class FractalCreator extends Applet
{
     public void paint(Graphics g)
     {
          Scanner s=new Scanner(System.in);
          System.out.println("How many branches do you want each node to have?");
          int branches=s.nextInt();
          System.out.println("How many times do you want the fractal to repeat?");
          int repetitions=s.nextInt();
     }
}

我想知道的是如何阻止图形 window 重新绘制和重新 运行 一切,或者,如果这不可能,我有什么替代方案用于绘制内容的图形 class。

我使用 main 方法将代码放入非 Applet 代码中,并且它 运行 一次,正如预期的那样。

如果相关,我将 DrJava 用作 IDE。

你的问题的答案是,你不能。

所以你搞砸了一堆事情。小程序(通常)不会有用于交互的控制台——您尤其不应该在 paint 方法中执行此操作,因为这可能会对用户与您的 UI 的交互产生不利影响。

GUI 是事件驱动的环境,也就是说,某事发生了,你就响应它。您仍在以 linear/procedural/console 的方式思考

我的第一条建议是,根本不要使用小程序,它们现在不值得您花时间学习。如果您想要图形输出,我会先让 Creating a GUI With JFC/Swing 更好地理解如何通过事件驱动的环境与用户交互。

然后我建议您查看 Painting in AWT and Swing and Performing Custom Painting 以更好地了解绘画在 Swing 中的工作原理。

方案一:使用一个成员变量来表示Applet是否已经被绘制。可能容易出错。

解决方案 2:在 init() 方法中,将图片绘制到 BufferedImage 成员变量中,然后在 paint() 方法中,简单地绘制该图片。

正如我之前的回答所述,您在处理绘画的错误事件方法中进行操作,因为正如您所注意到的那样,它会被一遍又一遍地绘制。