【发布时间】:2015-03-25 02:22:22
【问题描述】:
我已经阅读了这里关于paintComponent 的许多主题,其中大部分都表明在调用paintComponent 时选择永远或几乎永远不需要(或可能)。
然而,在我的程序中,有时(仅有时)paintComponent 在它需要绘制的一些对象完成初始化之前甚至有时在它们创建之前被调用,从而触发警告 - JOptionPane 弹出窗口,令人惊讶的是不显示它们被硬编码以显示在“消息”区域中的任何文本。我在其他地方读到它与 EDT 有关,并且我已经研究了其中的某些部分,但我只是感到困惑。如果 EDT 的主要目的是更新 gui,并且默认情况下几乎所有内容都将在 EDT 中运行,那么我可以告诉程序在不同的线程中运行所有初始化和更新函数吗?在 EDT 运行之前强制运行?
我最理想的情况是让paintComponent等到我的代码中的某个点运行(在一堆更新函数之后,不管屏幕发生了什么。在它被调用之后,它随后是一个暂停,其中发生的事情相对较少(我一直在使用 Thread.sleep() 在 while 循环中)并且一直持续到用户单击某些东西 - 此时再次运行所有必要的函数,然后是paintComponent然后是 sleep() while 循环等。
据我了解,我认为我想要的实际上是不可能的,所以我的问题是:你们对如何解决这个问题有什么想法吗?
编辑: 所以本质上,这个程序是一个大学课程规划器,旨在让某人更容易在学期内规划他们在毕业前必须修读的所有课程,移动这些课程(如果可能的话),看看所有课程是如何联系起来的(先决条件等)。当程序启动时,它从一个文本文件中加载必要的课程列表,然后从一堆单独的文本文件中加载有关每门课程的信息,并根据它们的先决条件进行排列。第一学期没有先修课的课程,第一学期所有先修课程都加到第二学期,以此类推,直到所有课程都加完。当paintComponent 运行时,它调用一个函数,假设每个课程的所有先决条件都存在于日程表上,如果发现不存在,它会抛出一个错误并显示一个JOptionPane 消息框。如果在程序的正常运行期间发生这种情况(例如,如果我在添加先决条件之前手动添加课程),则一切正常并正确显示。但是有时当只加载了一些课程时会弹出该消息框(意味着控件仍在主构造函数中),并且当它这样做时,实际的字符串消息不会显示 - 只有实际的窗格、标题和 ok按钮做。这是我显示错误框的行,因此您可以知道我并没有尝试显示可能为空的字符串变量。
JOptionPane.showMessageDialog(这个, "课程无法加载,部分 >加载\n课程已被删除。", “错误”, JOptionPane.OK_OPTION);
这是“课程无法...被删除”。不显示的部分。这是我显示的唯一一个标题为“错误”的 JOptionPane。 这篇文章提到了听起来好像发生了同样的事情,除了我没有使用海报必须修复的任何东西。所以可能它是无关紧要的,但我会添加它以防万一。 JOptionPane.showMessageDialog() shows but without any message?
但是退一步说,因为在添加所有课程之前弹出了那个框,这意味着在相关 JPanel 的构造函数中间调用了paintComponent,在一堆东西被初始化之前。我添加了一堆 println() 语句以确保这是真的。发生这种情况是否正常,如果是这样,有没有办法在不简单地使用 Andrew Thompson 的建议的情况下解决它?
经过一番思考,我认为由于该项目有 3200 行长并且在很大程度上依赖于文本文件,我真的不确定如何(或者如果我可以)为它制作 SSCCE。 .
如果有任何具体的部分有帮助,我会很乐意添加这些内容,但如果这个问题显然不是我弄错的标准问题,那么我将添加该标志并继续寻找错误。
感谢您的帮助
【问题讨论】:
-
paintComponent gets called before some of the objects it needs to paint have finished initializing- 比如?举出具体的例子。我从来没有遇到过问题。JOptionPane pop-ups, which surprisingly do not show any of the text they were hard-coded to display in their "message" area.- 从未见过这样的事情。问题可能是您的代码结构。发布您的SSCCE 来证明问题。
标签: java swing paintcomponent event-dispatch-thread