所以我有这个问题。我有一个创建和加载文件的程序。
当我将一个文件加载到我的程序中时,我依赖一个组件监听器,它告诉我什么时候特定的组件是“满的”,然后根据它移动所有的组件。
我将每个组件添加到顶部,然后在父组件“填充”时注册监听器,并将底部组件移动到它也创建的新父组件。把它看作是在一个粗大的页面MSWord文档的开头添加新的文本行。
该监听器还依赖于GUI设置--如果内存中的所有内容都没有绘制到屏幕上,它就会抓取错误的组件高度(通常为0),并在计算中使用它们,然后出现错误,一切都会变得一团糟。
下面是我的程序的这一部分的流程图:
(每一次检查都发生在JPanel上的JFrame上)
trigger opening method:
{
repeat this x (lets say e.g. 100) times:
{
trigger addComponent method
{
add component
{
adding component triggers the component listner 8if there is no more room in parent)
{
move all of the components one place down, move the ones out of bounds to next "page"
repaint and revalidate whole JFrame (inside listener)
}
}
repaint and revalidate whole JFrame (part of addComponent method)
}
repaint and revalidate whole JFrame(part of opening methid, after component addition)
}
repaint and revalidate whole JFrame (as a part of opening method, final repaint/validate)
}这样做的原因可能是重新绘制/验证,因为addComponent方法以及侦听器具有其他功能,并且在其他地方被调用,这是重新绘制/验证的唯一(最佳)位置。
问题是,在最后一次(最后)验证/重新绘制操作方法调用之前,JFrame不会被重新绘制。为了证明这一点,我尝试将Thread.sleep(1000)添加到代码中的几个地方(在验证/重新绘制之后)。
另外,据我所知,当一个组件侦听器被触发时,它会在触发它的行停止,然后执行自己,然后从该行继续,对吗?
我该怎么解决这个问题?在每个新组件添加ant之后,如何强制我的程序重新绘制/验证,然后在侦听器完成它的工作后再重新绘制/验证?
对前两个注释的答复是:首先,Thread.sleep(1000)只是为了诊断问题。就在Thread.sleep(1000)方法被重新绘制/验证方法之前,所以我想如果在调用reapint()之后暂停程序,每次暂停之后,GUI都会被重新绘制,我会看到添加了新的元素,情况并非如此。
其次,关于冗长的计算,这些计算并不长(用20个组件执行这些计算会得到瞬间的结果,虽然不是期望的结果)。而且,这种计算通常需要将组件移除并添加到GUI中(每10-20行),因此将SwingWorker集成在其中几乎是不可能的,而不是必需的。
第三,我认为你错过了整件事。在这里,执行的长度不是真正的问题,也不是冻结GUI的问题(无论如何,这个问题并没有发生,也没有足够长的时间被注意到)。问题是在循环中调用了重新绘制/验证,每个组件总共调用了3-4次(cca )。当我打开一个包含20个组件的文件时,我唯一看到它被执行的时候是上次调用它的时候,在循环之后.
我甚至将System.out.println(“某某物”)方法放在重新绘制/验证之前和之后。它打印了两次“某样东西”,但是重新绘制/验证从未发生。
发布于 2012-09-29 14:00:13
JFrame -> JPanel e.i.)JPanel e.i.)放置在JScrollPane中pack() / remove / modify JComponent之后调用JFrame,然后在屏幕上更改JFrame的大小(例如)。https://stackoverflow.com/questions/12653283
复制相似问题