我必须强制我的程序在添加新组件的时候验证并重新绘制我的gui(或其中的一部分)。在组件在屏幕上绘制之前,必须先完成absolutley,然后代码才能继续。
我正在创建一个分层的JPanel结构。一系列JPanel,每个JPanel都会连续播放一系列JPanel,每个JPanel都包含一系列JPanel。
当我创建第三级JPanel时,我需要从尚未绘制的第一级JPanels中获取数据。这会导致他们返回错误的数据并弄乱整个设置。
第一级JPanels只在主循环(一个通过第一级JPanels)完成后才被绘制。
我如何强制我的程序在创建并添加到其父项后立即绘制它? 这里的一切都是在EDT内部完成的,我查了一下。重绘和验证根本不起作用。
编辑: 好的,我使用了Robins解决方案。
但是,有一种方法可以强制即时GUI更新,只要代码中的行被执行(选择循环到finins和类似的东西)。如果可能的话,调试一些东西会容易得多。即使insta-update意味着暂停所有其他线程。
答案 0 :(得分:3)
当我创建第3级JPanel时,我需要从第1级获取数据 尚未绘制的JPanels。这导致他们返回错误的数据 并弄乱了整个设置。
我首先建议将此设置更改为更安全的设置。必须依赖UI元素的绘制顺序听起来像是讨厌问题的良好来源。
第一级JPanels仅在master for循环后绘制(一个 已经完成了第一级JPanels。
如何强制我的程序在创建后立即绘制它 添加到其父母?这里的一切都是在EDT内部完成的,我查了一下。 重绘和验证根本不起作用。
它不起作用,因为你阻止了EDT。调用repaint
和/或validate
实际上不会触发重新绘制。相反,它安排一个。你可以尝试在你在EDT上安排的几个单独的Runnable
中分解你的主循环。这可能允许Runnable
调用的预定repaint
在两者之间滑动。但是,不能保证这一点。
答案 1 :(得分:1)
您应该拥有一个GUI数据模型,其中包含您要放在面板上的信息。
您将生成信息,然后创建GUI组件。