使用多维数组列表填充JComboBox

时间:2018-04-16 00:28:53

标签: java swing arraylist jcombobox

我一直在尝试使用构造函数使用Array列表填充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 [] {&#34; Strawberry&#34;,&#34; Banana&#34;,&#34; Oranges&#34;}));
但是当我从文本文件中导入它们时,我不知道列表中有什么水果。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

不要在循环中继续创建新的ComboBoxModel。如果继续创建新模型,则无法向模型添加多个项目。因此,您只能看到添加了单个项目时创建的最后一个模型。如果你想使用这种方法,那么你将创建循环的模型OUTSIDE,然后只需在模型INSIDE循环中添加项目。

实际上你没有事件需要创建一个组合框模型。您只需将项目直接添加到组合框中即可:

类似的东西:

bsName

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

答案 1 :(得分:0)

如果您希望在组合框中显示Item个对象,则应声明JComboBox以存储Item个对象。通过这种方式,您可以轻松添加项目,而无需根据模型进行任何操作:

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

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

JComboBox API的唯一不明智的缺点是您必须投射所选项目:

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

这很难看,我希望API不要求它,但要避免必须定义自己的模型,这是一个很小的代价。

事实上,您可以通过以下方式避免演员:

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

但那只是丑陋的。

顺便说一下,这是标准Java教程和样本已经过时的几个领域之一,所以不知道如何不知道使用泛型。