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

标签 java swing paintcomponent event-dispatch-thread

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

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

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

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

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


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


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

但是要退后一步,因为在添加所有课程之前会弹出该框,这意味着在初始化一堆东西之前,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 ..

关于java - 有什么办法可以延迟PaintComponent吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246394/

相关文章:

java - 我的自定义 JTextField 由 super.paintComponent(g) 方法覆盖

java - Java中滚动后的矩形条

Java私有(private)静态内部类

java - 在jsp页面上输出perl脚本

java - Java 中的 __LINE__ 等效项?

java.lang.ArrayIndexOutOfBoundsException : 21 >= 21

java - 在 HTMLEditorKit/JEditorPane 中强制使用 <strong> 而不是 <b>

java - 单击按钮后如何将值传递给 JPanel 类?

java - 如何将 JLabel 放在矩形内

java - 可以访问Android智能手 secret 钥库吗?