Java 使用JComboBox从同一对象中的数据更改JLabel:
我正在尝试设计一个GUI,但我确实被某个问题所困扰,这涉及到使用JComboBox来更改JLabel中的数据,但关键是JLabel中的数据来自组合框所需的对象数据 示例:假设arraylist,每个区域设置中都有对象:Java 使用JComboBox从同一对象中的数据更改JLabel:,java,object,user-interface,arraylist,Java,Object,User Interface,Arraylist,我正在尝试设计一个GUI,但我确实被某个问题所困扰,这涉及到使用JComboBox来更改JLabel中的数据,但关键是JLabel中的数据来自组合框所需的对象数据 示例:假设arraylist,每个区域设置中都有对象: ArrayList<Animals> FarmAnimals = new ArrayList<Animals>(); FarmAnimals.add(new Animals("Cows", "Black")); FarmAnimals.add(n
ArrayList<Animals> FarmAnimals = new ArrayList<Animals>();
FarmAnimals.add(new Animals("Cows", "Black"));
FarmAnimals.add(new Animals("Pigs", "Pink");
FarmAnimals.add(new Animals("Sheep", "White"));
ArrayList
请注意,当您更改EV或IV时,或者如果您更改口袋妖怪,则侧边的统计信息将直接根据所选的口袋妖怪以及EV和IV输入的更改而更改。我希望在我正在制作的GUI中有这种行为(统计数据会直接根据输入进行更改,我假设这些输入会直接连接到为每个Pokey存储的对象数据),但我似乎无法模仿它。这里有一种技术:
- 将所有
动物
数据存储在一个数组中,就像您当前所做的那样
- 给
Animal
类一个方法来接收相关的对象数据,不管它以何种形式最自然地表示(例如,如果您所有的动物特定数据都是类似颜色的字符串列表,那么String[]
或list
将是保存此数据的好方法)。让我们调用这个方法getData()
- 重写
Animal.toString()
,返回要在组合框中显示的动物名称
- 现在,用动物列表填充组合框。使用
JComboBox.addItem
将每个动物直接添加到组合框中李>
- 到组合框。在动作侦听器中,您可以使用
(动物)组合框.getSelectedItem()
直接检索所选的动物
- 现在您已经选择了
动物
,可以调用动物.getData()
来获取要放入标签中的数据。您也可以在此处调用Animal
的任何其他方法
基本上,上面的想法是利用JComboBox
直接存储和返回实际对象的能力。然后,您可以直接从所选的动物
获取相关数据,并相应地用该数据更新其他GUI元素(例如,您的标签)
关于上述内容,需要注意以下几点:
- 如果由于某种原因,覆盖
Animal.toString()
以提供显示字符串不适合您的情况(例如,正如MadProgrammer在评论中指出的,toString()
通常用于调试输出,而不是对用户有意义的信息),则您还有其他选择。例如,您可以向组合框添加字符串
s,如果组合框未排序,可以利用组合框索引与动物
数组中的索引相同这一事实。然后在动作监听器中,获取所选索引,并以这种方式查找动物。另一个选项是定义一个自定义的ListCellRenderer
,这超出了本答案的范围(但信息可以在internet上随时获得)
- 您还可能注意到,使用上述方法实际上不需要单独的动物数组。您可以将组合框本身用作“数组”。这可能足以满足您的需要,但请记住,它确实将您的逻辑与GUI紧密地联系在一起,并且可能会在更复杂的应用程序中导致问题,尤其是在编写单元测试或编写需要收集动物的方法时(最终您必须传递
JComboBox
/comboxmodel
本身,或者将其中的项复制到临时数组中),等等
如果这有点含糊不清,很抱歉,希望它能让您走上正确的道路。toString
不是生成对象格式的合适方法。toString
提供有关对象的信息,可能对调试有用-请参阅Date#toString
-您不想使用它显示日期信息,您想使用日期格式化程序。列表单元格渲染器负责确定如何在JComboBox
@MadProgrammer中呈现给定时间/上下文中给定时刻的给定对象。我在您发布的同时添加了一个与此相关的注释。我将尝试一下。谢谢大家。