我需要一个有81个框的GUI,用户可以选择输入一个数字(是游戏的一个板)。
所以我将ComposableModel
子类化为81个实例变量,每个变量初始化为一个新的TextInputFieldModel
实例。
问题是打开需要大约6秒钟。为什么打开81个文本框需要这么长时间?我有什么办法可以加快开放速度吗?
答案 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上,因此您可以尝试加快该部分的速度(遗憾的是该方法未被删除)
如果你应用Leandro的建议,你可以加快从
到
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模式的实现