【问题标题】:For some reason, paint() is being called twice [duplicate]出于某种原因,paint() 被调用了两次 [重复]
【发布时间】:2014-04-13 08:37:51
【问题描述】:

这是我的代码:

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

发生的事情是在它打印出“位置”变量后,它跳回并重新开始。我不知道为什么会这样。

【问题讨论】:

  • 启动此程序时,它只为 me 打印一次。
  • 什么时候打印两次?您第一次启动程序的时间是什么时候?
  • 不要将基于控制台的输入与图形界面混合使用,尤其是在小程序环境中。 Paint 可能出于多种原因,多次调用 RepaintManager,这是对 Paint 的不当使用
  • 是的,当我启动它时,它会给出两个数字。运行时你有没有改变什么?
  • @MadProgrammer 我知道我不应该那样做,我只是在测试为什么我在为我的作业画圆圈时总是得到错误的输出。最初我不得不“在随机位置绘制 50 个随机直径的圆圈”,但由于paint() 被刷新,我一直得到错误数量的圆圈。

标签: java applet paint


【解决方案1】:

正如 MadProgrammer 所指出的,您正在尝试绘制到 JApplet,它不仅没有绘制方法,而且是一个顶级容器,如 JFrame 和 JDialog。您不想绘制到顶级容器。将它放在一个 JPanel 或一些允许您覆盖 paintComponent 方法的较低级别的容器中。

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

并确保在 paintComponent 方法中以 super.paintComponent(g); 作为第一行调用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 设计为事件驱动的,而不是顺序的。

【讨论】:

  • 别忘了,JApplet 没有paintComponent 方法;)
  • 哦,伙计,现在我比以往任何时候都更加困惑。我试着用这种方式画一个简单的圆圈,但没有用。然后我再次尝试使用 for 循环,但也没有用。
  • 你在代码中放了什么?如果可以,将其编辑到您的代码中。我为你做了一个小例子,每次点击按钮时都会画一个圆圈:pastebin.com/EwYZVnAf 看看,如果你理解得更好一点,请告诉我!
猜你喜欢
  • 2011-10-03
  • 2018-03-20
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-07-23
相关资源
最近更新 更多