2011-08-05 66 views
1

我有這個類來表示在組合框中選擇:爲什麼不在我傳遞給JComboBox的對象上調用toString()?

class Choice(object): 
    def __init__(self, id, label): 
     self.id = id 
     self.label = label 

    def toString(self): 
     print "in Choice.toString" #for debugging 
     return self.label 

Choice對象的數組,我想顯示的JComboBox標籤值,但要能夠再次找到了ID,後陣列已經超出了範圍。

在JComboBox中渲染器,the Java Swing tutorial says的主題,

的默認渲染器如何呈現字符串和圖標。如果將其他對象放在組合框中,則默認渲染器會調用toString方法以提供要顯示的字符串。

所以,因爲我已經添加了一個toString()方法我Choice類,我應該只能夠做到這一點:

choices = [Choice(1, 'foo'), Choice(3, 'bar'), Choice(5, 'baz')] 
combo = JComboBox(choices) 

再後來:

pickedId = combo.getSelectedItem().id 

然而,在我的組合中顯示的文本就像<command.Choice object at 0x2>,並且我已經將print聲明放入Choice.toString()從未發生過。

任何想法?

+2

我不熟悉Python/Jython中,但也許您創建的toString()方法不延長「無效Object.toString()」(也許簽名不符)。嘗試使用javap檢查編譯的類。 – JimN

回答

3

找到了!在Atrey的回答和JimN的評論背後,我發現Python相當於toString()實際上是__repr__

所以我的課,現在看起來像:

class Choice(object): 
    def __init__(self, id, label): 
     self.id = id 
     self.label = label 

    def __repr__(self): 
     return self.label 
+1

這很有趣,因爲'__repr__'應該返回一個python代碼來重新創建對象,而'__str__'應該返回一個對象更自然的表示。好找! – Atreys

+1

@Areys「可以重新創建對象的返回代碼」想法已被刷新一段時間;在很多情況下結果是一個糟糕的主意(或者至少不可行)。 –

2

你應該在你的python類中覆蓋__str__(self)

+1

(一個假設,'toString'用於Java,'__str__'用於python) – Atreys

+0

嗯,看起來像是一個很好的猜測,但它沒有幫助:( –

+2

找出來了,結果相當於'toString'不是'__str__',而是'__repr__'。感謝您指點我正確的方向!:) –

相關問題