2015-12-26 55 views
1

因爲我似乎無法找到某個預定義的Morph,它可以顯示Dictionary的內容,所以我決定最好不要再找,並且想創建我自己的Morph。我發現一個nice description如何從一些很好的示例代碼開始讓我開始,但很快我遇到了問題,我似乎無法在畫布上繪製文本或類似的東西。如何在smalltalk中以變形形式顯示字典的內容?

我創建了一個類

Morph subclass: #DictionaryView 
    instanceVariableNames: 'dictionary' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'StatisticsTool' 

,我想重寫drawOn如下:

drawOn: aCanvas 

    | x y | 
    x := 0. 
    y := 0. 
    dictionary associationsDo: [ :assoc | 
     aCanvas drawString: assoc key at: [email protected] 
     aCanvas drawString: assoc value at: [email protected] 
     y := y + 10. ]. 

我知道這是不完全的代碼,最好的一塊(我不知道還怎麼我應該考慮最長的字符串等,但我已經到了這個地步,我甚至不想再想這件事了),但我只是想顯示一些東西。不幸的是,這似乎並沒有當我嘗試

d := Dictionary new. 
d at: 'test1' put: 5. 
d at: 'test2' put: 23. 
d at: 'test3' put: 514. 

view := DictionaryView new. 
view dictionary: d. 
view openInWorld. 

我得到一個錯誤的工作:Instances of SmallInteger are not indexable

我不知道該怎麼辦了。我其實沒有時間寫這些長長的問題,或者爲這樣的事情看一整週。這一切都讓我非常緊張和不耐煩,因此我想直接詢問:

如何在Smalltalk中顯示字典以便我可以在GUI中使用它?

PS:在應對壓力的任何提示,也歡迎;)

+0

怎麼樣使用'd inspect'或'd探索「,他們都在字典上打開視圖(視察員)。他們甚至允許你編輯對象。 –

+0

謝謝,但我希望能夠在我的問題中提到的GUI中顯示它...我把我的問題不清楚嗎? –

+0

查看'Debugger'的執行情況。正是這樣做。它將上面的檢查器變體嵌入到它自己的用戶界面中。你也可以做到的。 –

回答

4

您的錯誤的根源就在這裏

aCanvas drawString: **assoc key** at: [email protected] 
    aCanvas drawString: **assoc value** at: [email protected] 

有沒有保證任何人會是字符串(和你的情況值是數字),所以你必須手動轉換它們

aCanvas drawString: assoc key printString at: [email protected] "or asString" 
    aCanvas drawString: assoc value printString at: [email protected] 

你應該能夠很容易地調試這種類型的問題。

關於字符串的寬度,您可以詢問字符串的長度。

Preferences standardDefaultTextFont heightOfString: 'hello' 

更新:

你也可以簡單地所有的值轉換爲StringMorph S和組合在一起。

DictionaryView>>dictionary: aDictionary 
    | container keys values | 
    (container := Morph new) 
     layoutPolicy: TableLayout new; 
     listDirection: #leftToRight. 
    (keys := Morph new) layoutPolicy: TableLayout new. 
    (values := Morph new) layoutPolicy: TableLayout new. 
    aDictionary 
     associationsDo: 
      [ :assoc | 
      keys addMorph: assoc key printString asMorph. 
      values addMorph: assoc value printString asMorph ]. 
    container 
     addMorph: keys; 
     addMorph: values. 
    self addMorph: container 

(當然除去#drawOn:方法將不再需要)

顯然有很多需要改進的地方,但是這出這個Q的範圍& A.

或者,您可以使用MulticolumnLazyListMorph小部件。

+0

我必須承認,我提出了嚴重的問題。我需要它在變形中顯示,以便在界面中使用它...我很抱歉。 –

+0

@MrTsjolder我已經更新了答案;如果你想要別的東西,那麼你需要更好地指定你的問題 –

+0

這種方式可以改進?這對我來說似乎是一個很好的解決方案(可能是因爲我沒有設法在整個星期內顯示任何東西)。另外,如何使用這些LazyListMorph?我一直在尋找代碼,但我沒有找到如何在我的字典中附加數據。無論如何非常感謝! –

1

使用Canvas及其繪圖API主要是關於實現 您自己的基礎Morphs。如果你想構建一個GUI,你可以嘗試使用現有的Morphs作爲構建塊。

就像Debugger/Inspector不實現他們自己的列表變形,你可以使用現有的類別 。 LazyListMorphs由PluggableListMorphs使用。你可以插入一個模型, 提供列表和一些選擇器的列表選擇行爲。

|list listMorph| 
list := Smalltalk allClasses. 
listMorph := PluggableListMorph on:list list:#yourself selected:nil changeSelected:nil. 
listMorph openInHand 

這是一個簡單的例子。在真實世界的應用程序中,您將實現一個提供列表的模型類(請參見Inspector或其他工具)。

如果要列出字典的內容,你可以建立一個多listMorph兩個「子列表」(鍵,值), 另一個多列例如:

|listOfLists listMorph| 
listOfLists := { (1 to:100) asArray . (1 to:100) collect:[:x | x * x]}. 
listMorph := PluggableMultiColumnListMorph on:listOfLists list:#yourself  selected:nil changeSelected:nil. 
listMorph openInHand 
相關問題