加速ComposableModel新的openWithSpec(在Pharo v3中)

时间:2015-01-03 19:30:48

标签: user-interface smalltalk pharo

我需要一个有81个框的GUI,用户可以选择输入一个数字(是游戏的一个板)。

所以我将ComposableModel子类化为81个实例变量,每个变量初始化为一个新的TextInputFieldModel实例。

问题是打开需要大约6秒钟。为什么打开81个文本框需要这么长时间?我有什么办法可以加快开放速度吗?

2 个答案:

答案 0 :(得分:4)

您可以使用Profiler进行此操作。我试图重新创建您的UI要求并在工具中运行它 - >时间分析器。这是代码:

| specArray widgets view layout |
" Configure the Spec models "
specArray := OrderedCollection new: 81 * 2.
1 to: 81 do: [ : index | specArray 
    add: ('textInput' , index asString) asSymbol;
    add: #TextInputFieldModel ].
view := DynamicComposableModel new
        instantiateModels: specArray;
        extent: 300@800;
        title: 'Title'
        yourself.
" Configure the Spec layout "
widgets := specArray reject: [ : ti | ti = #TextInputFieldModel ].
layout := SpecLayout composed
        newColumn: [ : r | 
        widgets doWithIndex: [ : ti : index | r add: ti ] ];
        yourself.
" Set up the widgets "
widgets doWithIndex: [ : each : index | (view perform: each) text: index asString  ].
" Open the Window "
(view openWithSpecLayout: layout) delete.

正如您在屏幕截图中看到的那样,大部分时间花在TextInputFieldModel>> defaultEntryCompletion上,因此您可以尝试加快该部分的速度(遗憾的是该方法未被删除)

enter image description here

如果你应用Leandro的建议,你可以加快从

  • 3902符合,3912毫秒。
  • 3916符合,3927毫秒。

  • 1985年的结果,1988毫秒。

TextInputFieldModel>> defaultEntryCompletion中的代码为:

defaultEntryCompletion

    | applicants |
    applicants := (Array streamContents: [:strm | 
                    Smalltalk globals keysDo: [ : each | (each notEmpty and: [each first canBeGlobalVarInitial]) 
                        ifTrue: [ strm nextPut: each ] ] ]) sort.

    ^ EntryCompletion new
                dataSourceBlock: [:currText | applicants];
                filterBlock: [:currApplicant :currText | currText size > 3
                        and: [currApplicant asUppercase includesSubstring: currText asString asUppercase]].

答案 1 :(得分:3)

处理这个问题的传统方法是使用一个矩阵变形和一个文本域变形。矩阵负责将文本字段放在正确的位置,确保文本字段更新,并为没有焦点的字段绘制文本。

这是flyweight模式的实现