1

私は現在、(かなり古い)アプリケーションのバグを修正しています:

これには、遅延読み込み機能とクイック検索テキストフィールドを持つツリーが含まれます。次のシナリオを想定します。

  1. 誰かがクイック検索テキストフィールドに文字列を入力します
  2. これにより、クエリがバックグラウンドでサーバーに送信され、入力された名前で使用可能なツリーノードが検索され、ドロップダウンスタイルで提供されます。
  3. ユーザーはドロップダウンリストからアイテムを選択します。
  4. 選択した要素へのパスにあるツリー内のすべてのノードが展開され、レイジーロードツリーがロードされます...まあ...ノードの束。
  5. ツリー(スクロールバーがあります)がスクロールし、選択した要素が表示されます。

手順1から4は問題なく機能しますが、手順5は、ツリーが要素を遅延ロードする必要がなく、以前にツリーを既にロードしている場合にのみ機能します。

しばらくデバッグした後、これはスクロールする量を計算するコードがツリーノードを表すAWT要素の次元を使用しているためだと思いました。ただし、要素が遅延ロードされた場合、ディメンションはまだ計算されていないため、コードは無効になります。寸法計算はリペイント方法で行われると思います。またはとにかく:手遅れです。

AWTにコンポーネントサイズをすぐに計算させるにはどうすればよいですか?

このコードは、AWTの上にThinletを使用しています。

4

1 に答える 1

0

あなたの問題は、AWT 側ではなく、Thinlet 側にあるようです。そして、それは 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 に答える