有什么办法可以延迟 PaintComponent?
Any way to delay PaintComponent?
我在这里阅读了很多关于 paintComponent 的话题,其中大部分都指出在调用 paintComponent 时从来没有或几乎没有必要(或不可能)选择。
然而,在我的程序中,有时(只是有时)paintComponent 在它需要绘制的某些 objects 完成初始化之前被调用,有时甚至在它们被创建之前调用,触发警告 - JOptionPane pop-ups,令人惊讶的是,它们没有显示任何 hard-coded 要在其 "message" 区域中显示的文本。我在其他地方读到它与 EDT 有关,我已经研究了其中的某些部分,但我只是感到困惑。如果 EDT 的主要目的是更新 gui,默认情况下几乎所有东西都会在 EDT 中 运行,那么我可以告诉程序 运行 不同的初始化和更新函数吗线程,我在 EDT 运行s?
之前以某种方式强行制作了 运行
我最希望发生的事情是让 paintComponent 等到我的代码中的某个点成为 运行(在一堆更新函数之后,不管屏幕上发生了什么。之后它确实被调用了,然后是一个暂停,其中发生的事情相对较少(我一直在 while 循环中使用 Thread.sleep() )并且一直持续到用户单击某些东西 - 此时所有必要的函数又是 运行,之后是 paintComponent,然后是 sleep() while 循环,等等
据我了解,我认为我想要的东西实际上是不可能的,所以我的问题是:你们有什么想法可以解决这个问题吗?
编辑:
所以从本质上讲,该程序是一个大学课程计划器,旨在让某人更容易按学期计划他们在毕业前必须修读的所有课程,移动这些课程(如果可能),并查看所有课程之间的联系(先决条件等)。当程序启动时,它会从一个文本文件中加载必要课程的列表,然后从一堆单独的文本文件中加载有关每门课程的信息,并根据它们的先决条件进行排列。没有先决条件的课程在第一学期开始,所有先决条件都被添加到第一学期的课程被添加到第二学期,依此类推,直到所有课程都被添加。当 paintComponent 运行s 时,它会调用一个函数,该函数假定每个课程的所有先决条件都存在于时间表中,如果发现其他情况,则会抛出错误并显示 JOptionPane 消息框。当这种情况发生在程序的正常 运行 期间(例如,如果我在添加先决条件之前手动添加课程),一切正常并显示正确。但有时当只加载了一些课程时弹出消息框(意味着控制仍在主构造函数中)并且当它这样做时,实际的字符串消息不会显示 - 只有实际的窗格,标题和确定按钮做。这是我显示错误框的行,因此您可以知道我不是要显示可能为空的字符串变量。
JOptionPane.showMessageDialog(this,
"Course couldn't be loaded, partially >loaded\ncourses have been removed.",
"Error",
JOptionPane.OK_OPTION);
"Course couldn't...been removed." 部分没有显示。这是我显示的唯一一个标题为 "Error" 的 JOptionPane。
这个 post 提到了听起来像是发生了同样的事情,除了我没有使用任何 poster 必须修复的东西。所以可能它无关紧要,但我会添加它以防万一。 JOptionPane.showMessageDialog() shows but without any message?
但退一步说,因为在添加所有课程之前弹出该框,这意味着在初始化一堆东西之前,在相关 JPanel 的构造函数中间以某种方式调用了 paintComponent。我添加了一堆 println() 语句以确保这是真的。发生这种情况是否正常,如果是这样,是否有一种方法可以在不简单地使用 Andrew Thompson 的建议的情况下解决它?
经过一番思考,我认为因为该项目长达 3200 行并且在很大程度上依赖于文本文件,所以我真的不确定如何(或者如果我可以)为它..
如果有任何特定的部分会有所帮助,我会很乐意添加它们,但如果这个问题显然不是某个标准问题,我就错了,那么我将只添加该标志并继续寻找错误。
感谢您的帮助
将标志声明为 class 属性。在 paint 方法中检查它。在初始化结束时更改它。
class XandYandZ extends JComponent {
boolean initializationFinished = false;
public XandYandZ() {
// long initialisation..
initializationFinished = true;
}
public void paintComponent(Graphics g) {
if (!initializationFinished) return;
// .. paint ..
我在这里阅读了很多关于 paintComponent 的话题,其中大部分都指出在调用 paintComponent 时从来没有或几乎没有必要(或不可能)选择。
然而,在我的程序中,有时(只是有时)paintComponent 在它需要绘制的某些 objects 完成初始化之前被调用,有时甚至在它们被创建之前调用,触发警告 - JOptionPane pop-ups,令人惊讶的是,它们没有显示任何 hard-coded 要在其 "message" 区域中显示的文本。我在其他地方读到它与 EDT 有关,我已经研究了其中的某些部分,但我只是感到困惑。如果 EDT 的主要目的是更新 gui,默认情况下几乎所有东西都会在 EDT 中 运行,那么我可以告诉程序 运行 不同的初始化和更新函数吗线程,我在 EDT 运行s?
之前以某种方式强行制作了 运行我最希望发生的事情是让 paintComponent 等到我的代码中的某个点成为 运行(在一堆更新函数之后,不管屏幕上发生了什么。之后它确实被调用了,然后是一个暂停,其中发生的事情相对较少(我一直在 while 循环中使用 Thread.sleep() )并且一直持续到用户单击某些东西 - 此时所有必要的函数又是 运行,之后是 paintComponent,然后是 sleep() while 循环,等等
据我了解,我认为我想要的东西实际上是不可能的,所以我的问题是:你们有什么想法可以解决这个问题吗?
编辑: 所以从本质上讲,该程序是一个大学课程计划器,旨在让某人更容易按学期计划他们在毕业前必须修读的所有课程,移动这些课程(如果可能),并查看所有课程之间的联系(先决条件等)。当程序启动时,它会从一个文本文件中加载必要课程的列表,然后从一堆单独的文本文件中加载有关每门课程的信息,并根据它们的先决条件进行排列。没有先决条件的课程在第一学期开始,所有先决条件都被添加到第一学期的课程被添加到第二学期,依此类推,直到所有课程都被添加。当 paintComponent 运行s 时,它会调用一个函数,该函数假定每个课程的所有先决条件都存在于时间表中,如果发现其他情况,则会抛出错误并显示 JOptionPane 消息框。当这种情况发生在程序的正常 运行 期间(例如,如果我在添加先决条件之前手动添加课程),一切正常并显示正确。但有时当只加载了一些课程时弹出消息框(意味着控制仍在主构造函数中)并且当它这样做时,实际的字符串消息不会显示 - 只有实际的窗格,标题和确定按钮做。这是我显示错误框的行,因此您可以知道我不是要显示可能为空的字符串变量。
JOptionPane.showMessageDialog(this, "Course couldn't be loaded, partially >loaded\ncourses have been removed.", "Error", JOptionPane.OK_OPTION);
"Course couldn't...been removed." 部分没有显示。这是我显示的唯一一个标题为 "Error" 的 JOptionPane。 这个 post 提到了听起来像是发生了同样的事情,除了我没有使用任何 poster 必须修复的东西。所以可能它无关紧要,但我会添加它以防万一。 JOptionPane.showMessageDialog() shows but without any message?
但退一步说,因为在添加所有课程之前弹出该框,这意味着在初始化一堆东西之前,在相关 JPanel 的构造函数中间以某种方式调用了 paintComponent。我添加了一堆 println() 语句以确保这是真的。发生这种情况是否正常,如果是这样,是否有一种方法可以在不简单地使用 Andrew Thompson 的建议的情况下解决它?
经过一番思考,我认为因为该项目长达 3200 行并且在很大程度上依赖于文本文件,所以我真的不确定如何(或者如果我可以)为它..
如果有任何特定的部分会有所帮助,我会很乐意添加它们,但如果这个问题显然不是某个标准问题,我就错了,那么我将只添加该标志并继续寻找错误。
感谢您的帮助
将标志声明为 class 属性。在 paint 方法中检查它。在初始化结束时更改它。
class XandYandZ extends JComponent {
boolean initializationFinished = false;
public XandYandZ() {
// long initialisation..
initializationFinished = true;
}
public void paintComponent(Graphics g) {
if (!initializationFinished) return;
// .. paint ..