Java 有什么办法可以延迟喷漆吗?

Java 有什么办法可以延迟喷漆吗?,java,swing,paintcomponent,event-dispatch-thread,Java,Swing,Paintcomponent,Event Dispatch Thread,我已经在这里通读了很多关于paintComponent的线程,其中大多数都指出,在调用paintComponent时,不需要或几乎不需要(或可能)选择 然而,在我的程序中,有时(仅有时)在需要绘制的某些对象完成初始化之前调用paintComponent,有时甚至在创建它们之前调用paintComponent,从而触发警告-JOptionPane弹出窗口,令人惊讶的是,这些弹出窗口没有显示它们硬编码后要显示在“消息”区域中的任何文本。我曾在其他地方读到,这与EDT有关,我也研究了其中的一些部分,但

我已经在这里通读了很多关于paintComponent的线程,其中大多数都指出,在调用paintComponent时,不需要或几乎不需要(或可能)选择

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

理想情况下,我希望paintComponent等到代码中的某一点才运行(在一系列更新函数之后,不管屏幕上发生了什么。在调用它之后,会出现一个相对较少的暂停(我在while循环中使用了Thread.sleep())这会一直持续到用户单击某个东西为止——此时所有必要的函数都会再次运行,然后是paintComponent,然后是sleep()while循环,等等

据我所知,我认为我想要的其实是不可能的,所以我的问题是:你们有什么想法来解决这个问题吗

编辑: 因此,该课程本质上是一个大学课程规划器,旨在让学生更容易在毕业前每学期计划好所有必须修的课程,将这些课程转移(如果可能的话),并查看所有课程之间的联系(先决条件等)。当程序启动时,它会从文本文件中加载必要课程的列表,然后从一堆单独的文本文件中加载有关每门课程的信息,并根据其先决条件进行排列。没有先决条件的课程在第一学期开始,先决条件已添加到第一学期的课程将添加到t第二个,依此类推,直到所有课程都被添加。当paintComponent运行时,它调用一个函数,该函数假定每个课程的所有先决条件都存在于计划中,如果它发现不存在,它将抛出一个错误并显示一个JOptionPane消息框。当这发生在程序的正常运行期间(就像我在添加先决条件之前手动添加一门课程),所有内容都正常工作并显示。但有时,当仅加载了部分课程时,会弹出消息框(这意味着控件仍在主构造函数中)当它这样做时,实际的字符串消息不会显示-只有实际的窗格、标题和“确定”按钮会显示。这是我显示错误框的行,因此您可以知道,我没有试图显示可能为空的字符串变量

JOptionPane.showMessageDialog(此, “无法加载课程,部分>加载\n课程已被删除。”, “错误”, JOptionPane.OK_选项)

这是“课程无法…被删除”部分,没有显示。这是我显示的唯一一个标题为“错误”的作业窗格。 这篇文章提到了类似的事情,除了我没有使用poster必须修复的任何东西。所以可能与此无关,但我会添加它以防万一

但要向后退一点,因为在所有的课程被添加之前,那个盒子弹出了,这意味着在一组事物被初始化之前,PrultCebe在相关JPAND的构造函数中间被调用了。声明,以确保这是真实的。这是正常的发生,如果是的话,有没有一种方法来解决它,而不只是使用安德鲁·汤普森的建议

在考虑了一下之后,我认为因为这个项目有3200行长,并且在很大程度上依赖于文本文件,我真的不知道如何(或者如果我可以)为它制作一个SSCCE

如果有任何特定的部分会有帮助的话,我会很高兴地添加它们,但是如果这个问题不是很明显的标准问题,我就错了,那么我会添加那个标志并继续寻找bug


感谢您的帮助

将标志声明为类属性。请在paint方法中检查它。在初始化结束时更改它

class XandYandZ extends JComponent {

  boolean initializationFinished = false;

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

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

paintComponent在它需要绘制的某些对象完成初始化之前被调用
-例如?给出具体的例子。我从来没有遇到过问题。
JOptionPane弹出窗口,令人惊讶的是,它们没有显示任何硬编码要在“消息”中显示的文本区域。
-从未见过这样的事情。问题可能是你的代码结构。在你演示这个问题之后。现在我觉得自己很笨。我可能会这么做,但我想了解为什么我的代码会这样做,如果可能的话。这看起来不像是一件已知的事情,在所有事情之前调用paintComponentinside已完成初始化。虽然我想我不知道为什么paintComponent会等待。这是一个标准问题还是这只是在我的代码中隐藏错误?谢谢:)“还是这只是在我的代码中隐藏错误?”要获得更详细的帮助,请发布(最小完整可验证示例)或(简短、自包含、正确的示例)。我怀疑@camickr发现了一个设计缺陷。为了更好地提供修复建议,我们需要更多关于它的细节。为此,我更愿意让代码(MCVE)来说话。你是对的,我的问题假设你知道我的代码(对不起,我一直忘了其他人不知道!),我会在主要帖子中添加更多关于它的内容。