我正在尝试编写一个绘制分形的简单程序,并编写了以下代码。我运行它来测试它是否有效并发现它每次运行两次。我寻找答案,发现它可能与图形窗口重绘有关,并因此重新运行整个代码。在我看到的其他问题中,似乎没有人关注使代码不多次运行,而是为什么它正在这样做,并且没有提供任何补救措施作为结果。但是,由于我正在使用扫描仪,因此重复运行程序非常不方便,而我主要担心的是它只运行一次。
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();
}
}
我想知道的是如何阻止图形窗口重绘和重新运行所有内容,或者,如果不可能,我有什么替代方法可以让Graphics类绘制内容。
我使用main方法将代码放入非Applet代码中,并按原样运行一次。
如果相关,我使用DrJava作为IDE。
答案 0 :(得分:0)
你的问题的答案是,你不能。
所以你搞砸了一堆东西。小程序不会(通常)拥有一个用于交互的控制台 - 您尤其不应该在paint
方法中执行此操作,因为这可能会对用户与UI的交互产生负面影响。
GUI是事件驱动的环境,也就是说,某些事情会发生并且您会对其做出响应。您仍在思考基于线性/程序/控制台的方式
我的第一条建议是,根本不使用小程序,他们现在不值得你花时间学习。如果你想要一个图形输出,我首先要有Creating a GUI With JFC/Swing,以便更好地理解如何通过事件驱动的环境与用户进行交互。
我建议您查看Painting in AWT and Swing和Performing Custom Painting,以便更好地了解绘画在Swing中的工作原理。
答案 1 :(得分:0)
解决方案1:使用成员变量来指示Applet是否已经绘制过。可能容易出错。
解决方案2:在init()方法中,将您的图片绘制到BufferedImage成员变量,并在paint()方法中绘制该图片。
正如我之前的回答所说,你在处理绘画的错误事件方法中行事,因为正如你所注意到的那样,它会被反复绘制。