听众和验证/重新绘制

时间:2012-09-29 13:54:30

标签: java swing validation listeners program-flow

所以我有这个问题。我有一个创建和加载文件的程序。

当我将一个文件加载到我的程序中时,我依靠一个组件监听器来告诉我特定组件何时“满”,然后根据该组件移动所有组件。

我在顶部添加每个组件,然后在父组件“填充”时将侦听器注册,并将底部组件移动到它也创建的新父组件。可以把它想象成在一个houndred页面MSWord文档的开头添加一行新文本。

该监听器还依赖于GUI设置 - 如果内存中的所有内容都未绘制到屏幕上,它会抓取错误的组件高度(通常为0)并在其计算中使用它们然后出错,并且一切都搞砸了

以下是我程序部分的流程图:

(每次都在JFrame中的JPanel上发生)

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)添加到代码中的几个位置(在验证/重绘之后)以证明这一点。

另外,据我所知,当一个组件监听器被触发时,它会在触发它的行停止,然后自行执行,然后从该行继续,对吧?

我该如何解决这个问题?如何在每个新组件添加后强制我的程序重新绘制/验证,然后在侦听器完成它之后再次添加?

回复前两条评论: 首先,Thread.sleep(1000)只是为了诊断问题。在Thread.sleep(1000)方法之前就是重绘/验证方法,所以我想如果我在调用reapint()之后暂停程序,在每次暂停之后,GUI将被重新绘制广告我会看到添加了新元素,这不是案件。

其次,关于冗长的计算,那些计算并不那么长(用20个组件执行此计算得到瞬间结果,但不是那些期望的结果)。此外,该计算需要经常删除和添加组件到GUI(每10-20行),因此将SwingWorker合并到一起几乎是不可能的,而且不需要。

第三,我认为你错过了重点。执行的长度不是这里的真正问题,也不是GUI的冻结(无论如何都不会发生,不管多长时间都不能说明)。问题是每个组件在循环中调用repaint / validate总共3-4次(如果我打开一个包含20个组件的文件,则为60-80次),并且我看到它被执行的唯一时间是最后一次被调用,循环之后......

我甚至在重绘/验证之前和之后放置了System.out.println(“something”)方法。它打印出“东西”两次,但重复/验证从未发生过。

1 个答案:

答案 0 :(得分:2)

  • 我可以在容器中看到任何问题with add / remove / modify JComponentsJFrame - > JPanel e.i。)

  • 取决于容器(JPanel e.i。)是否放在JScrollPane

  • 取决于您是否需要在容器中pack() / add e / remov modify之后致电JComponent,然后再进行更改屏幕上JFram e的大小(例如)