Fantom fwt Combo виджет, кажется, запускает модифицировать событие на строительстве

Я написал этот класс Fantom

using gfx
using fwt

class Test {

    Window window := Window {
        size = Size( 400, 320 )
        SashPane {
            Combo {
                items = Month.vals
                onModify.add( |e| { echo( "items.size is ${e->widget->items->size}" ) } )
            },
        },
    }

    Void main() {
        window.open
    }
}

когда я запускаю его, он производит такой вывод:

items.size is 12
items.size is 12

Это означает, что событие модификации запускается дважды. Это происходит в то же время, когда на экране появляется окно, и у меня не было никакой возможности что-либо изменить в виджете Combo. Зачем?

Это вызывает проблемы в реальном классе, который использует несколько виджетов Combo, некоторые из которых связаны, и вызывает каскад событий, который приводит к неожиданным результатам.

Есть ли способ предотвратить это, пожалуйста?

1 ответ

Решение

Я могу подтвердить, что это проблема.

Глядя на исходный код Java для FWT Combo, он довольно маленький и, кажется, не делает ничего плохого, что наводит меня на мысль, что это проблема с SWT Combo Widget.

Это вам не поможет, поэтому я быстро поиграл с примером и нашел эту работу...

...добавить onModify прослушиватель событий после того, как окно было открыто, и виджеты построены. Сделайте это с помощью Window.onOpen() событие:

using gfx
using fwt

class Testy {
    Void main() {
        Window {
            size = Size( 400, 320 )
            combo := null as Combo
            onOpen.add {
                combo.onModify.add { echo("Hello Mum!") }
            }
            SashPane {
                combo = Combo { items = Month.vals },
            },
        }.open
    }
}

Теперь вы должны только получить Hello Mum! когда комбо на самом деле модифицируется.

Другие вопросы по тегам