Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JComboBox从同一对象中的数据更改JLabel:_Java_Object_User Interface_Arraylist - Fatal编程技术网

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

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

我正在尝试设计一个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"));
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中呈现给定时间/上下文中给定时刻的给定对象。我在您发布的同时添加了一个与此相关的注释。我将尝试一下。谢谢大家。