有什么办法可以延迟PaintComponent吗?

HammerN'Songs

在这里,我已经阅读了很多paintComponent上的线程,其中大部分都指出,调用paintComponent时从不需要或几乎没有必要选择(或可能选择)。

但是,在我的程序中,有时(仅有时)在需要绘制的某些对象完成初始化之前甚至在创建之前,调用paintComponent,从而触发警告-JOptionPane弹出窗口,令人惊讶的是未显示任何内容他们被硬编码以显示在其“消息”区域中的文本。我在其他地方已经读到它与EDT有关,我已经研究了其中的某些部分,但我只是感到困惑。如果EDT的主要目的是更新gui,并且默认情况下几乎所有内容都将在EDT中运行,那么我可以告诉程序在不同的线程中运行所有初始化和更新功能,我以某种方式在EDT运行之前强行进行运行?

我理想地希望发生的事情是使paintComponent等待直到代码中的特定点被运行(在执行一系列更新函数之后,无论屏幕发生了什么。调用它之后,其后都是一个暂停,其中进行的操作相对较少(我一直在while循环内使用Thread.sleep()),一直持续到用户单击某些内容为止-此时再次运行所有必需的功能,然后再运行paintComponent,然后sleep()while循环等。

根据我的理解,我认为我真正想要的是不可能的,所以我的问题是:你们对如何解决这个问题有任何想法吗?

编辑:所以从本质上讲,该计划是大学课程计划者,旨在使某人更容易在一个学期之前计划出他们在毕业之前必须修读的所有课程,将这些课程四处移动(如果可能),以及查看所有课程的方式。已连接(先决条件等)。程序启动时,它将从文本文件中加载必要课程的列表,然后从一堆单独的文本文件中加载有关每个课程的信息,并根据其先决条件进行排列。没有先决条件的课程将在第一学期开始,其先决条件已全部添加到第一学期的课程将被添加到第二学期,依此类推,直到所有课程都已添加。当paintComponent运行时,它会调用一个函数,该函数假定时间表中存在每个课程的所有前提条件,如果发现其他条件,它会引发错误并显示JOptionPane消息框。在程序正常运行期间发生这种情况时(例如,如果我在添加先决条件之前手动添加了课程),则所有程序都可以正常工作并显示。但是有时候,当仅加载了某些课程时(该控件仍在主构造函数中),该消息框就会弹出,并且当它加载时,实际的字符串消息不会显示-仅显示实际的窗格,标题和确定。按钮做。这是我显示错误框的行,因此您可以知道我没有在尝试显示可能为空的字符串变量。但是有时候,当仅加载了某些课程时(该控件仍在主构造函数中),该消息框就会弹出,并且当它加载时,实际的字符串消息不会显示-仅显示实际的窗格,标题和确定。按钮做。这是我显示错误框的行,因此您可以知道我没有在尝试显示可能为空的字符串变量。但是有时候,当仅加载了某些课程时(该控件仍在主构造函数中),该消息框就会弹出,并且当它加载时,实际的字符串消息不会显示-仅显示实际的窗格,标题和确定。按钮做。这是我显示错误框的行,因此您可以知道我没有在尝试显示可能为空的字符串变量。

JOptionPane.showMessageDialog(这,“无法加载课程,已部分加载的课程已被删除。”,“错误”,JOptionPane.OK_OPTION);

这是“课程无法...被删除。” 不会显示的部分。这是我显示的唯一带有标题“ Error”的JOptionPane。这篇文章提到听起来好像发生了同样的事情,除了我没有使用海报必须修复的任何东西。因此可能无关紧要,但我以防万一。JOptionPane.showMessageDialog()显示但没有任何消息吗?

但是要退后一步,因为在添加所有课程之前会弹出该框,这意味着在初始化一堆东西之前,paintComponent在相关的JPanel的构造函数中间被以某种方式调用。我添加了一堆println()语句来确保这是正确的。发生这种情况是否正常?如果是这样,有没有一种方法可以解决而不必简单地使用Andrew Thompson的建议?

经过一番思考后,我认为由于该项目长3200行,并且在很大程度上依赖于文本文件,因此我真的不确定如何(或者如果可以)为此创建SSCCE。

如果有任何特定的帮助,我会很乐意添加,但是如果这个问题显然不是标准问题,那么我就错了,那么我将添加该标记并继续寻找错误。

谢谢你的帮助

安德鲁·汤普森

声明一个标志作为类属性。在涂漆方法中检查它。在初始化结束时进行更改。

class XandYandZ extends JComponent {

  boolean initializationFinished = false;

  public XandYandZ() {
    // long initialisation..
    initializationFinished = true;
  }

  public void paintComponent(Graphics g) {
    if (!initializationFinished) return;
    // .. paint ..

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章