使用JComboBox从同一对象中的数据更改JLabel:

时间:2014-03-21 02:23:47

标签: java object user-interface arraylist

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

示例:在每个区域设置中包含对象的假设arraylist:

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

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

现在,我想用&#34; Cows&#34;,&#34; Pigs&#34;和&#34; Sheep&#34;来填充JComboBox,这很容易做成一个字符串数组价值。问题在于,当我假设选择&#34; Cows&#34;时,我想要一个颜色JLabel来显示&#34; Black&#34;,&#34; Pink&#34;和&#34;白&#34;分别在选择时:理想情况下来自阵列中的对象数据(以防万一我有更多的奶牛数据或者像我想要稍后输入的动物噪音的爪子大小或响度)。

有没有办法让ItemListener执行此操作,或者至少是否有一个教程显示如何直接影响与JComboBox中的内容关联的对象的JLabel数据?或者我只是愚蠢而且有更好的方法吗?感谢。

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

http://pokemonshowdown.com/damagecalc/

请注意,当您更改EV或IV时,或者更换宠物小精灵时,侧面的统计数据会根据所选的宠物小精灵和EV&amp; D的变化直接改变。 IV输入。我想在GUI中制作这种行为(统计数据直接根据输入进行更改,我假设这些输入直接连接到为每个Pokey存储的对象数据。)但我似乎无法模仿它。

1 个答案:

答案 0 :(得分:0)

这里的一种技巧是:

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

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

有关上述事项的几点注意事项:

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

很抱歉,如果这有点模糊,希望它能让你开始走正确的道路。