使用多维数组列表填充 JComboBox

Populating JComboBox using an MultiDimensional Array List

我一直在尝试使用构造函数使用数组列表来填充 Eclipse GUI Java JComboBox,但没有任何运气。这是我迄今为止尝试过的。

import item.Item;  
import javax.swing.JComboBox;
import java.util.ArrayList;  


public class SelectionScreen{
    private JFrame frame;
    static ArrayList< Item> list;
    private String items;

     public static void main (String[] args){  

        initialize();
     }
     public void initialize(){
        list = new ArrayList< Item >();  
        list.add(new Item("Strawberry,200,.25,.75);
        list.add(new Item("Banana,200,.25,1.00);  
        list.add(new Item("Oranges,200,.25,2.00);


       JcomboBox comboBox = newJcomboBox();
       ComboBox.setBounds(63,29,86,22)
       frame.getContentPane().add(comboBox); 

     // here is where I tried to fill the combobox

     //comboBox.setModel(new DefaultComboBoxModel(Item.getName()))); //Wrong
     //comboBox.setModel(Item.getName); //Wrong

  //the following only loads the last item in the list which is Oranges
     for(Item i: list{

      comboBox.setModel(new DefaultComboBoxModel(New String[] { 
      i.getName()})); 
      }

   // tried making a different list to collect my fruits.
     for(Item i: list){
     list2[ i.getName()];
     Item.length;
     } //which was a complete fail.

我完全迷失在这里并且对 Java 不是很有经验。我可以使用 comboBox.setModel(new DefaultComboBoxModel(new String[]{ "Strawberry","Banana","Oranges"}));
但是当我从文本文件中导入它们时,我不知道列表中有什么水果。

如有任何帮助,我们将不胜感激。

/*The following only loads the last item in the list which is Oranges.*/

for(Item i: list)
{
      comboBox.setModel(new DefaultComboBoxModel(new String[] { 
      i.getName()})); 
}

不要在循环中不断创建新的 ComboBoxModel。如果您不断创建新模型,则不能向模型中添加多个项目。因此,您只能看到最后创建的模型,其中添加了单个项目。如果您想使用这种方法,那么您可以在循环外部创建模型,然后只需在循环内部的模型中添加项目。

实际上您根本不需要创建组合框模型。您可以直接将项目添加到组合框:

类似于:

for(Item i: list
{
      comboBox.addItem( i.getName() );
}

另一种选择是将 Item 对象直接添加到组合框中。然后您可以使用自定义渲染器来控制 Item 对象的 属性 显示在组合框中。查看 Combo Box With Custom Renderer 了解有关此方法的更多信息。

如果您希望在组合框中显示 Item 个对象,那么您应该声明 JComboBox 以存储 Item 个对象。这样您就可以轻松添加项目,而无需对模型进行任何处理:

JComboBox<Item> itemsCombo = new JComboBox<>();
list.forEach(itemsCombo::add);

组合框中显示的值将是 Item.toString 返回的值。如果这不是您想要的(因为您的 toString returns 对对象的更完整描述 - 通常被认为是更好的做法),那么编写您自己的 Custom Renderer 相当容易。

JComboBoxAPI 唯一的缺点是您必须施放所选项目:

Item selectedItem = (Item)itemsCombo.getSelectedItem();

这很丑陋,我希望 API 不需要它,但是为了避免定义您自己的模型,这是一个很小的代价。

事实上,您可以通过以下方式避免强制转换:

Item selectedItem = itemsCombo.getItemAt(itemsCombo.getSelectedIndex());

但这也同样丑陋。

顺便说一句,这是标准 Java 教程和示例已经过时的几个领域之一,因此这里完全不能因为不知道使用泛型而受到指责。