Java AWT:立即计算部件尺寸

Java AWT:立即计算部件尺寸,java,awt,thinlet,Java,Awt,Thinlet,我目前正在修复一个(相当旧的)应用程序中的错误: 它涉及一个具有延迟加载函数和快速搜索文本字段的树。假设以下场景: 有人在“快速搜索”文本字段中键入字符串 这将导致将查询发送到后台的服务器,用输入的名称搜索可用的树节点,并以下拉样式提供它们 用户从下拉列表中选择一项 树中位于选定元素路径中的所有节点都将展开,从而导致延迟加载树加载。。。好一堆节点 树(有一个滚动条)滚动,这样选定的元素就会出现在视图中 步骤1到4可以正常工作,但步骤5仅在树不需要延迟加载元素,但之前某个时候已经加载了树的情况下才

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

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

  • 有人在“快速搜索”文本字段中键入字符串
  • 这将导致将查询发送到后台的服务器,用输入的名称搜索可用的树节点,并以下拉样式提供它们
  • 用户从下拉列表中选择一项
  • 树中位于选定元素路径中的所有节点都将展开,从而导致延迟加载树加载。。。好一堆节点
  • 树(有一个滚动条)滚动,这样选定的元素就会出现在视图中
  • 步骤1到4可以正常工作,但步骤5仅在树不需要延迟加载元素,但之前某个时候已经加载了树的情况下才有效

    经过一段时间的调试,我发现这是因为计算滚动多少的代码使用了表示树节点的AWT元素的维度。但是如果元素是延迟加载的,那么就不会计算维度,因此代码是无效的。我猜尺寸计算将在重新绘制方法期间进行。或者无论如何:太晚了

    如何让AWT立即计算部件尺寸


    代码在AWT之上使用。

    看起来您的问题更多地是在Thinlet方面,而不是在AWT方面。它看起来像是Thinlet中的一个bug。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);
    

    您是否至少知道要选择的节点上方有多少可见的树元素,以及它在树中的深度?在延迟加载发生之前是否可能知道这一点?如果没有,那么AWT就不能变魔术。@MikhailVladimirov:没有,在延迟加载之前我不知道这一点,但是延迟加载代码是同步的。在我执行滚动代码之前,元素将被完全加载。所有数据都在那里,只是还没有呈现出来。