Java 出于某种原因,paint()被调用了两次

Java 出于某种原因,paint()被调用了两次,java,applet,paint,Java,Applet,Paint,这是我的代码: public class Circles extends JApplet{ public void paint(Graphics g) { Scanner in = new Scanner(System.in); Random rand = new Random(); int position = rand.nextInt(200); System.out.println(position);

这是我的代码:

public class Circles extends JApplet{
public void paint(Graphics g)      {          

    Scanner in = new Scanner(System.in);
    Random rand = new Random();

    int position = rand.nextInt(200);

    System.out.println(position);            
   }
}
结果是:

199

152


在打印出“position”变量后,它会跳回并再次启动。我不明白它为什么会这样做。

正如MadProgrammer所指出的,您正在尝试绘制到JApplet,它不仅没有绘制方法,而且是一个类似JFrame和JDialog的顶级容器。您不希望在顶级容器中绘制。将它放在JPanel或某个较低级别的容器中,该容器允许您重写paintComponent方法

你不想把它放在你的绘画方法中。另外,如果您使用的是Swing,请使用
paintComponent
方法(您使用的是在名称前面带有J的Swing)

并确保使用
super.paintComponent(g)调用paintComponent的原始父方法
作为
paintComponent
方法中的第一行

所以它看起来像:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //anything else you want goes here
    //don't get in the habit of creating Objects in here
    //and don't do anything that's not event-driven
}
在重写的paintComponent方法中,不要放置除绘制内容以外的任何内容。您不应该将用户输入放入其中并避免创建对象,因为不仅可能有更好的方法,而且创建对象可能会花费大量时间,这对于快速重复调用的方法来说是非常糟糕的

您无法控制重新绘制应用程序的时间。连续调用
paintComponent/paint
方法,您的设计应该基于此


将GUI设计为事件驱动的,而不是顺序的。

正如MadProgrammer所指出的,您正在尝试绘制到JApplet,它不仅没有绘制方法,而且是类似JFrame和JDialog的顶级容器。您不希望在顶级容器中绘制。将它放在JPanel或某个较低级别的容器中,该容器允许您重写paintComponent方法

你不想把它放在你的绘画方法中。另外,如果您使用的是Swing,请使用
paintComponent
方法(您使用的是在名称前面带有J的Swing)

并确保使用
super.paintComponent(g)调用paintComponent的原始父方法
作为
paintComponent
方法中的第一行

所以它看起来像:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //anything else you want goes here
    //don't get in the habit of creating Objects in here
    //and don't do anything that's not event-driven
}
在重写的paintComponent方法中,不要放置除绘制内容以外的任何内容。您不应该将用户输入放入其中并避免创建对象,因为不仅可能有更好的方法,而且创建对象可能会花费大量时间,这对于快速重复调用的方法来说是非常糟糕的

您无法控制重新绘制应用程序的时间。连续调用
paintComponent/paint
方法,您的设计应该基于此


将GUI设计为事件驱动的,而不是顺序的。

启动此程序时,它只为我打印一次。何时为您打印两次?第一次启动程序时,不要将基于控制台的输入与图形界面混合使用,尤其是在小程序环境中。Paint可以被称为repaitmanager,原因有很多,有很多次,这是paintmanager的不当使用。是的,当我启动它时,它给出了两个数字。你在运行它的时候做了什么改变吗?@MadProgrammer我知道我不应该这样做,我只是在测试为什么我在为我的作业画圆圈时总是得到错误的输出。最初我必须“在随机位置以随机直径绘制50个圆”,但由于paint()正在刷新,我一直得到错误的圆数。启动此程序时,它只为我打印一次。何时为您打印两次?第一次启动程序时,不要将基于控制台的输入与图形界面混合使用,尤其是在小程序环境中。Paint可以被称为repaitmanager,原因有很多,有很多次,这是paintmanager的不当使用。是的,当我启动它时,它给出了两个数字。你在运行它的时候做了什么改变吗?@MadProgrammer我知道我不应该这样做,我只是在测试为什么我在为我的作业画圆圈时总是得到错误的输出。最初,我不得不“在随机位置以随机直径绘制50个圆”,但由于正在刷新paint(),我不断得到错误的圆数。别忘了,JApplet没有paintComponent方法;)哦,伙计,现在我比以前更困惑了。我试着用这种方法画一个简单的圆圈,但没有成功。然后我用一个for循环再次尝试了一遍,但也没有成功。你在代码中放了什么?如果可以,请将其编辑到代码中。我给你们举了一个小例子,每次点击按钮都会画一个圆:看看,告诉我你们是否理解得更好一点!别忘了,JApplet没有paintComponent方法;)哦,伙计,现在我比以前更困惑了。我试着用这种方法画一个简单的圆圈,但没有成功。然后我用一个for循环再次尝试了一遍,但也没有成功。你在代码中放了什么?如果可以,请将其编辑到代码中。我给你们举了一个小例子,每次点击按钮都会画一个圆:看看,告诉我你们是否理解得更好一点!