1

我目前正在修复(相当旧的)应用程序中的错误:

它涉及具有延迟加载功能和快速搜索文本字段的树。假设以下场景:

  1. 有人在快速搜索文本字段中键入字符串
  2. 这会导致查询被发送到后台服务器,使用输入的名称搜索可用的树节点,并以下拉样式提供它们。
  3. 用户从下拉列表中选择一个项目。
  4. 树中所选元素路径中的所有节点都被展开,导致延迟加载树加载……嗯……一堆节点。
  5. 树(有一个滚动条)滚动,以便选定的元素将在视图中。

第 1 步到第 4 步工作得很好,但第 5 步只有在树不需要延迟加载元素但之前已经加载过树的情况下才有效。

经过一段时间的调试,我发现这是因为计算滚动量的代码使用了代表树节点的 AWT 元素的尺寸。但是,如果元素是延迟加载的,则尚未计算尺寸,因此代码无效。我猜尺寸计算将在重绘方法期间发生。或者无论如何:为时已晚。

如何让 AWT 立即计算组件尺寸?

该代码在 AWT 之上使用Thinlet 。

4

1 回答 1

0

看起来您的问题更多的是在 Thinlet 方面,而不是在 AWT 方面。看起来这是 Thinlet 中的一个错误。Thinlet 确实尝试在进行实际滚动之前对要滚动到的节点进行布局,但这对于节点没有正确实现。

使用以下补丁使 Thinlet 在您的情况下正常工作:

--- Thinlet.java        2005-03-28 18:15:28.000000000 +0200
+++ Thinlet_new.java    2013-02-06 16:06:23.707530066 +0100
@@ -166,6 +166,10 @@

        private void doLayout(Object component) {
                String classname = getClass(component);
+               while ("node" == classname) {
+                 component = getParent(component);
+                 classname = getClass(component);
+               }
                if ("combobox" == classname) {
                        if (getBoolean(component, "editable", true)) {
                                Image icon = getIcon(component, "icon", null);
于 2013-02-06T15:11:03.727 回答