0

我发现该方法paint()在激活后一段时间(不能立即发生,可以吗?)init(),而不是在它完成后调用。我有一些在该方法中创建init()和绘制的对象。paint()但是绘图在对象初始化之前开始。这会导致异常,这些异常会自动处理。但这也会导致对象在第一次激活后不会被绘制paint()- 它们需要重新绘制才能显示出来。

我能够以paint()无限循环阻止方法的工作,放置在方法的开头,直到init()完成它的工作才停止(我猜init()paint()在单独的线程中运行)。但是一位受雇的 Java 程序员告诉我,这不是一个优雅的解决方案——我应该尝试做一些不同的事情(那个人没有告诉我该怎么做,他没有使用小程序,我猜,他从来没有遇到过这种情况问题,这就是我在这里问的原因)。

如何确保该paint()方法在完成工作之前不会激活init(),以及如何以优雅的方式实现它(在这种情况下应该是什么意思......)?

编辑:

我正在使用 Dr. Java - 出于某种原因,它在两台不同的计算机上运行小程序的方式不同:一台运行 Win XP 的非常旧的笔记本电脑(7 岁)和一台运行 Win XP 的 2 岁台式电脑7. 我犯了一个错误,不使用浏览器进行测试...

在桌面上使用 Dr. Java 进行测试时不会出现此问题。在浏览器上运行小程序时不会出现问题。它只发生在笔记本电脑上安装的编辑器上。我猜问题出在在“旧技术”上运行的代码编辑器中,而不是在代码中。

4

2 回答 2

2

简短的回答是你不能。正如您所怀疑的,Init 和paint 被两个不同的线程调用。

我想到的最优雅的解决方案是

  1. 检查paint方法中的空值
  2. 在 init 方法中使用 EventQueue.invokeLater 并将初始化代码放入其中,完成后调用 repaint
于 2012-12-04T20:06:40.917 回答
0
public void init() {
   // do my initing...
   inited = true;
   repaint();
}

public void paint(Graphics g) {
   if (!inited) {
      return;
   }

   // do my painting...
}
于 2012-12-04T20:15:52.577 回答