【问题标题】:Populating a JComboBox with an ArrayList from another class用另一个类的 ArrayList 填充 JComboBox
【发布时间】:2014-08-05 06:11:29
【问题描述】:

我正在尝试一些自学,并且正在开发一个小型应用程序,该应用程序从文本文件中读取详细信息并将其显示在 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);
    }
}

【问题讨论】:

    标签: java swing arraylist jcombobox


    【解决方案1】:

    你的问题是:box.addItem(list.toArray());

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

    相反,您应该在列表中添加单个项目,如下所示:

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

    编辑:再次阅读你原来的措辞问题,我认为你关于 GUI 的第二个代码 sn-p 不应该使用另一个 StuffArrayList 如果你真的打算使用 @ 987654330@ 在Stuff 对象的一个​​实例中。因此,你应该首先改变:

    private ArrayList<Stuff> list = new ArrayList<>();
    

    private Stuff = new Stuff();
    

    并更改 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
    }
    

    【讨论】:

    • 每个循环啊。我会试一试。谢谢。
    • 这取决于您打算添加到 JComboBox 的内容。我假设您想从 Stuff 类中添加 name。如果我的假设是正确的,那么是的,您应该在 Stuff 类中为 name 字符串添加一个 getter。
    • 如何在 Stuff 类中为 name 赋值?
    • @WadeG 我想我理解这种困惑。当您已经在 Stuff 类中使用了一个 ArrayList 时,您正在使用另一个 ArrayList。请查看我的更新答案。
    • hmm 现在无法在 for each 循环中找到符号列表。
    【解决方案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 编写的

    【讨论】:

    • 感谢您的帮助也疯狂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2015-10-08
    • 2010-11-20
    • 2019-08-14
    • 2014-10-02
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多