使用另一个类的ArrayList填充JComboBox

时间:2014-06-15 03:55:56

标签: java swing arraylist jcombobox

我正在尝试一些自我教导,正在开发一个小应用程序,它从文本文件中读取详细信息并在JComboBox中显示以供选择。计划是能够从组合框中选择一个项目,按下按钮并根据选择显示带有文本的弹出消息,但我离题了。

目前,当它编译时,组合框显示出我认为是某种异常。它说[Ljava.lang.Object;@175078b

我在这里做错了什么?

这是具有ArrayList

的类
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;

public class Stuff {

    private ArrayList<String> list;
    private String name;

    private ArrayList<String> getList() {
        return list;
    }

    private void setList(ArrayList list) {
        this.list = list;
    }

    public Stuff() {
        readNames();
    }

    public void readNames() {
        File file = new File("Names.txt");
        try {
            ArrayList<String> list = new ArrayList<>();

            Scanner in = new Scanner(file);
            while (in.hasNextLine()) {
                list.add(in.nextLine());
            }
            Collections.sort(list);
//            for (int i = 0;  i < list.size();++i){            
//        System.out.println(list.get(i));
//            }
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这是带有GUI的类:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.ArrayList;
import javax.swing.*;


public class GUI extends JFrame{
    private JLabel label = new JLabel("Who is the most awesome?");
    private JComboBox box = new JComboBox();
    private JFrame frame = new JFrame();
    private JTextArea text = new JTextArea();
    private JButton button = new JButton("Press Me");
    private JPanel panel = new JPanel();
    private ArrayList<Stuff> list = new ArrayList<>();


    private JFrame getFrame(){
        return frame;
    }
    private ArrayList<Stuff> getList(){
        return list;
    }
    private void setList (ArrayList<Stuff> list){
        list = list;
    }



    public GUI(){        
        buildGUI();
    }

    private void buildGUI(){           
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setLayout(new FlowLayout());
        panel.add(label);
        panel.add(box);
        panel.add(button); 
        box.addItem(list.toArray());

        frame.add(text);
        frame.add(panel, BorderLayout.CENTER);
        frame.setSize(400,100);
        frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:4)

您的问题在于:box.addItem(list.toArray());

JComboBox的{​​{3}}方法需要Object作为参数。通常,String对象用作参数。相反,当您真正想要添加列表中的每个项目时,您正在尝试将实际列表引用添加到组合框中。

相反,您应该按如下方式在列表中添加单个项目:

for(Stuff stuff : list) {
    box.addItem(stuff.getName());
}

编辑:再次阅读您原来措辞问题,我认为如果您真的打算使用,那么关于GUI的第二个代码段不应该使用ArrayList Stuff ArrayList Stuff对象的一个​​实例中的private ArrayList<Stuff> list = new ArrayList<>(); 。因此,您应该先改变:

private Stuff = new Stuff();

stuff.getList()

并更改for循环以迭代list而不是for(String detail : stuff.getList()) { box.addItem(detail); // add each extracted detail from the text file that was stored in the list of the stuff object } 。为了澄清,for循环可能如下所示:

{{1}}

答案 1 :(得分:2)

主要问题是你要在组合框中添加一个数组...

box.addItem(list.toArray());

您需要在列表中围绕项目列表构建ComboBoxModel ...

DefaultComboBoxModel model = new DefaultComboBoxModel(list.toArray(new Stuff[list.size()]));
box.setModel(model);

或者将列表中的每个项目添加到组合框

for (Stuff stuff : list) {
    box.addItem(stuff);
}

有关详细信息,请参阅How to use combo boxes

JComboBox中呈现值的责任归结为ListCellRenderer

请查看Providing a Custom Renderer了解详情。

此方法允许您自定义对象的呈现方式,而无需修改底层对象本身。它还意味着您维护对象关系。而不是必须在视图和原始对象列表之间提供某种映射,您只需从组合框中直接引用该对象,因为ListCellRenderer正在为您执行转换。

现在,已经说过,这将阻止用户使用搜索功能中内置的组合框。

为此,请检查Combo Box With Custom Renderer是否可以解决问题。这是由我们自己的camickr

撰写的