Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,applet:如何在init()完成之前阻止paint()的激活';工作_Java_Methods_Applet - Fatal编程技术网

Java,applet:如何在init()完成之前阻止paint()的激活';工作

Java,applet:如何在init()完成之前阻止paint()的激活';工作,java,methods,applet,Java,Methods,Applet,我发现方法paint()是在激活init()之后,而不是在它完成之后调用的(它不能立即发生,不是吗?)。我有一些对象是在init()中创建的,并在paint()方法中绘制的。但图形在对象初始化之前启动。这会导致自动处理的异常。但它也会导致对象在第一次激活paint()后无法绘制-它们需要重新绘制才能显示 我能够用一个无限循环来阻止paint()方法的工作,将它放在方法的开头,直到init()完成它的工作(我猜init()和paint()在不同的线程中运行)。但是一位受雇的Java程序员告诉我,这

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

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

如何确保
paint()
方法在
init()
完成工作之前不会激活,如何以优雅的方式进行操作(在本例中,这意味着什么…)

编辑:

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


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

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

我认为最优雅的解决方案是

  • 检查绘制方法中是否存在空值
  • 在init方法中使用EventQueue.invokeLater,并将初始化代码放在其中,完成后调用repaint

  • 是什么导致了
    喷漆
    ?我认为Java本身会尝试在
    init
    完成之前不调用它,特别是考虑到Swing不是线程安全的(我不确定AWT,但大多数本机对象也不是线程安全的,所以…)。你有另一个线程触发更新吗?如果是这样,请告诉它等待…或者,更好的是,在
    init
    的最后一段“运行Win XP的非常旧的笔记本电脑(7岁)”可能更相关的是它运行的是什么JRE?嗯。。。不。这与我的算法类似。@AlekZanDer您说过您在绘制方法的开始处放置了一个无限循环,该循环只有在init()完成时才退出。这很不一样。但它仍然会阻止绘制()的工作,直到init()完成。@AlekZanDer:这不正是你想要的吗?它看起来没有我的方式优雅。
    public void init() {
       // do my initing...
       inited = true;
       repaint();
    }
    
    public void paint(Graphics g) {
       if (!inited) {
          return;
       }
    
       // do my painting...
    }