【问题标题】:Using JComboBox to change JLabels from data within same object:使用 JComboBox 从同一对象中的数据更改 JLabels:
【发布时间】:2014-03-21 02:23:47
【问题描述】:

我正在尝试设计一个 GUI,但我确实陷入了某个问题,其中涉及使用 JComboBox 更改 JLabel 中的数据,但问题是 JLabel 中的数据来自组合框所需的对象数据。

示例:每个语言环境中包含对象的假设数组列表:

ArrayList<Animals> FarmAnimals = new ArrayList<Animals>();

FarmAnimals.add(new Animals("Cows", "Black"));    
FarmAnimals.add(new Animals("Pigs",  "Pink");    
FarmAnimals.add(new Animals("Sheep",  "White"));

现在,我想用“Cows”、“Pigs”和“Sheep”来填充 JComboBox,这很容易通过创建一个值的字符串数组来完成。问题是,当我假设选择“奶牛”时,我希望颜色 JLabel 在选择时分别显示“黑色”、“粉红色”和“白色”:理想情况下来自数组中的对象数据(以防万一我有更多关于奶牛的数据或任何类似爪子大小或动物噪音响度的数据,我想稍后输入)。

有没有办法让 ItemListener 做到这一点,或者至少有一个教程展示了如何直接影响与 JComboBox 中的内容相关联的对象中的 JLabel 数据?还是我只是愚蠢而有更好的方法?谢谢。

这可能是一个更好的例子:

http://pokemonshowdown.com/damagecalc/

请注意,当您更改 EV 或 IV 时,或者如果您更改口袋妖怪,侧面的统计数据会直接根据所选口袋妖怪以及 EV 和 IV 输入的变化而改变。我希望在我正在制作的 GUI 中出现这种行为(统计数据直接根据输入进行更改,我假设这些输入直接连接到为每个 Pokey 存储的对象数据。)但我似乎无法模仿它。

【问题讨论】:

    标签: java object user-interface arraylist


    【解决方案1】:

    这里的一种技术是:

    • 将您的所有Animal 数据存储在一个数组中,就像您目前所做的那样。
    • 为Animal 类提供一个接收相关对象数据的方法,以最自然地表示它的任何形式(例如,如果您的所有动物特定数据都是一个字符串列表,如颜色、String[] 或List&lt;String&gt; 将是保存此数据的好方法)。我们称这个方法为getData()。
    • 覆盖 Animal.toString() 以返回要在组合框中显示的动物的名称。
    • 现在,用动物列表填充组合框。使用JComboBox.addItem 将每个Animal 直接添加到组合框中。
    • Add an action listener 到组合框。在动作监听器中,您可以使用(Animal)comboBox.getSelectedItem() 直接检索选中的Animal。
    • 现在您已经选择了Animal,您可以调用theAnimal.getData() 来获取您想要放入标签的数据。您也可以在这里调用Animal 的任何其他方法。

    基本上,上面的想法是利用JComboBox 直接存储和返回您的实际对象的能力。然后您可以直接从选定的Animal 获取相关数据,并相应地使用该数据更新其他 GUI 元素(例如您的标签)。

    以上几点需要注意:

    • 如果由于某种原因重写 Animal.toString() 以提供显示字符串不适合您的情况(例如,正如 MadProgrammer 在 cmets 中指出的那样,toString() 通常用于调试输出而不是对用户有意义的信息) ,您还有其他选择。例如,您可以将Strings 添加到组合框,如果组合框未排序,则可以利用组合框索引与Animal 数组中的索引相同的事实。然后在您的动作侦听器中,您获得选定的索引,并以这种方式查找动物。另一种选择是定义一个自定义ListCellRenderer,这超出了此答案的范围(但信息在互联网上很容易获得)。
    • 您还可能注意到,您实际上并不需要使用上述方法的单独动物数组。您可以将组合框本身用作“数组”。这可能足以满足您的需求,但请记住,它确实将您的逻辑与 GUI 非常紧密地联系在一起,并且可能会在更复杂的应用程序中导致问题,尤其是当编写单元测试,或者编写期望动物集合的方法时(你最终不得不传递JComboBox/ComboBoxModel 本身,或者将其中的项目复制到一个临时数组中)等等。

    对不起,如果这有点含糊,希望它能让你走上正确的道路。

    【讨论】:

    • toString 不是生成对象格式的合适方法。 toString 提供有关可能对调试有用的对象的信息 - 请参阅 Date#toString - 您不想使用此输出来显示日期信息,您想使用 DateFormatter。 ListCellRenderer 负责确定在给定时间/上下文中的给定对象在JComboBox 中的呈现方式
    • @MadProgrammer 我在您发布的同时添加了一条与此相关的注释。
    • 我会试试这个。谢谢你们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2014-03-11
    • 2013-12-06
    相关资源
    最近更新 更多