首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >侦听器和验证/重新绘制

侦听器和验证/重新绘制
EN

Stack Overflow用户
提问于 2012-09-29 13:54:30
回答 1查看 984关注 0票数 1

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

当我将一个文件加载到我的程序中时,我依赖一个组件监听器,它告诉我什么时候特定的组件是“满的”,然后根据它移动所有的组件。

我将每个组件添加到顶部,然后在父组件“填充”时注册监听器,并将底部组件移动到它也创建的新父组件。把它看作是在一个粗大的页面MSWord文档的开头添加新的文本行。

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

下面是我的程序的这一部分的流程图:

(每一次检查都发生在JPanel上的JFrame上)

代码语言:javascript
复制
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(“某某物”)方法放在重新绘制/验证之前和之后。它打印了两次“某样东西”,但是重新绘制/验证从未发生。

EN

回答 1

Stack Overflow用户

发布于 2012-09-29 14:00:13

  • 我可以在容器中看到任何 JComponents问题(JFrame -> JPanel e.i.)
  • 取决于容器(JPanel e.i.)放置在JScrollPane
  • 取决于是否需要在容器中的pack() / remove / modify JComponent之后调用JFrame,然后在屏幕上更改JFrame的大小(例如)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12653283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档