2011-08-05 4 views
1

나는 콤보 상자에서 선택을 대표하는이 클래스가 있습니다JComboBox에 전달한 객체에서 swing을 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 메서드를 호출하여 표시 할 문자열을 제공합니다. 그러나

pickedId = combo.getSelectedItem().id 

:

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

하고 나중에 :

그래서, 내 Choice 클래스에 toString() 방법을 추가 한 주어진, 난 그냥이 작업을 수행 할 수 있어야한다 내 콤보에 표시되는 텍스트는 <command.Choice object at 0x2>과 같으며 Choice.toString()에 입력 한 내용의 print은 발생하지 않습니다.

아이디어가 있으십니까?

+2

(: 같은

그래서 내 클래스는 이제 보이는 어쩌면 서명이 일치하지 않을 수도 있습니다). javap을 사용하여 컴파일 된 클래스를 검사 해보십시오. – JimN

답변

3

발견! Atrey의 대답과 JimN의 의견 뒤에 나는 toString()에 해당하는 파이썬이 실제로 __repr__이라는 것을 알게되었습니다. 내가 파이썬/자이 썬에 익숙하지 해요,하지만 어쩌면 당신이 만들 toString() 메서드는 ") (무효는 Object.toString"을 연장하지 않습니다

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

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

재미있는 점은'__repr__'은 파이썬 코드를 반환하여 객체를 재생성해야한다는 것입니다.'__str__'는 객체의 자연스러운 표현. 좋은 발견! – Atreys

+1

@Atreys는 "개체를 다시 만들 수있는 반환 코드"아이디어가 잠시 동안 불명확하게되었습니다. 그것은 너무 많은 경우에 나쁜 생각 (또는 적어도 실현 불가능)으로 밝혀졌습니다. –

2

파이썬 클래스에서 __str__(self)을 덮어 써야합니다.

+1

(가설은'toString'은 자바 용이고'__str__'은 파이썬 용입니다) – Atreys

+0

흠, 좋은 추측처럼 보였지만 도움이되지 않았습니다 :( –

+2

'toString'과 동등한 것으로 나타납니다. '__str__'이 아니라'__repr__'입니다. 올바른 방향으로 나를 가르쳐 주셔서 감사합니다 :) –

관련 문제