Java 使用另一个类中的ArrayList填充JComboBox

Java 使用另一个类中的ArrayList填充JComboBox,java,swing,arraylist,jcombobox,Java,Swing,Arraylist,Jcombobox,我正在尝试一些自我教育,正在开发一个小应用程序,它可以从文本文件中读取详细信息,并将其显示在JComboBox中供选择。该计划是能够从组合框中选择一个项目,按下按钮,并有一个弹出消息显示文本取决于选择,但我离题了 目前,当它编译时,combobox显示了我认为是某种异常的东西。上面写着[Ljava.lang.Object;@175078b 我做错了什么 这是具有ArrayList的类: import java.io.File; import java.io.FileNotFoundExcepti

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

目前,当它编译时,combobox显示了我认为是某种异常的东西。上面写着
[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();
        }
    }
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.nio.charset.charset;
导入java.nio.file.Files;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Iterator;
导入java.util.Scanner;
公共类的东西{
私有数组列表;
私有字符串名称;
私有ArrayList getList(){
退货清单;
}
私有void集合列表(ArrayList列表){
this.list=列表;
}
公共物品{
readNames();
}
public void readNames(){
File File=新文件(“Names.txt”);
试一试{
ArrayList=新建ArrayList();
扫描仪输入=新扫描仪(文件);
while(在.hasNextLine()中){
list.add(in.nextLine());
}
集合。排序(列表);
//对于(int i=0;i
这是带有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);
    }
}
导入java.awt.BorderLayout;
导入java.awt.FlowLayout;
导入java.util.ArrayList;
导入javax.swing.*;
公共类GUI扩展JFrame{
private JLabel label=新JLabel(“谁是最棒的?”);
私有JComboBox=newjcombobox();
私有JFrame=新JFrame();
私有JTextArea text=新JTextArea();
私有JButton按钮=新JButton(“按我”);
private JPanel panel=new JPanel();
private ArrayList list=new ArrayList();
私有JFrame getFrame(){
返回框;
}
私有ArrayList getList(){
退货清单;
}
私有void集合列表(ArrayList列表){
列表=列表;
}
公共GUI(){
buildGUI();
}
私有void buildGUI(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setLayout(新的FlowLayout());
面板。添加(标签);
面板。添加(框);
面板。添加(按钮);
box.addItem(list.toArray());
框架。添加(文本);
添加(面板、边框布局、中心);
框架。设置尺寸(400100);
frame.setVisible(true);
}
}

您的问题在以下行中:
box.addItem(list.toArray());

JComboBox
的方法需要一个
对象
作为参数。通常,使用
字符串
对象作为参数。相反,您要做的是尝试将实际列表引用添加到组合框中,而实际上是要添加列表中的每个项目

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

for(Stuff stuff : list) {
    box.addItem(stuff.getName());
}
编辑:再次阅读您最初的文字问题,我认为您关于GUI的第二个代码片段不应该使用另一个
Stuff
ArrayList
,如果您实际上打算在
Stuff
对象的一个实例中使用
ArrayList
。因此,您应该首先更改:

private ArrayList<Stuff> list = new ArrayList<>();
并将for循环更改为遍历
stuff.getList()
而不是
list
。要澄清,for循环可能如下所示:

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
}

主要问题是您正在向组合框添加单个数组

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);
}
有关更多详细信息,请参阅

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

请查看以了解更多详细信息

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

话虽如此,这将阻止用户使用内置搜索功能的组合框


为此,请检查可能的解决方法。这是我们自己的camickr为每个循环编写的。

Ah a。我将试一试。谢谢。这取决于您打算向
JComboBox
添加什么。我假设您想从
Stuff
类中添加
名称。如果我的假设正确,那么是的,您可以在你的
Stuff
类中,应该为
name
字符串添加一个getter。我如何在Stuff类中为name赋值?@WadeG我想我理解这种混淆。你正在使用另一个
数组列表,而你已经在
Stuff
类中使用了一个。请查看我的更新答案。嗯,现在无法在for each循环中找到符号列表。谢谢你的帮助。
for (Stuff stuff : list) {
    box.addItem(stuff);
}