为什么Swing不对传递给JComboBox的对象调用toString()?

1 投票
2 回答
592 浏览
提问于 2025-04-16 22:56

我有一个类用来表示下拉框中的选项:

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的渲染器,Java Swing教程中提到

默认的渲染器知道如何显示字符串和图标。如果你在下拉框中放入其他对象,默认渲染器会调用这些对象的toString方法来提供一个字符串进行显示。

所以,既然我已经在我的Choice类中添加了一个toString()方法,我应该可以这样做:

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

然后稍后:

pickedId = combo.getSelectedItem().id

然而,我的下拉框中显示的文本却是<command.Choice object at 0x2>,而我在Choice.toString()中放的print语句从来没有执行过。

有什么想法吗?

2 个回答

2

你应该在你的Python类里面重写一下 __str__(self) 这个方法。

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

撰写回答