用另一个类的 ArrayList 填充 JComboBox

Posted

技术标签:

【中文标题】用另一个类的 ArrayList 填充 JComboBox【英文标题】:Populating a JComboBox with an ArrayList from another class 【发布时间】: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);
    

【问题讨论】:

【参考方案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 编写的

【讨论】:

感谢您的帮助也疯狂。

以上是关于用另一个类的 ArrayList 填充 JComboBox的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ArrayList 填充 JComboBox?

MS ACCESS:用另一个表中的数据填充子表单

用一种颜色作为描边绘制一个多边形,用另一种颜色作为填充?

用另一个 div 填充一个 div [重复]

在 CodeIgniter 中使用 jQuery 用另一个数据表填充数据表

Obj-C UIDownpicker 将在滚动期间用另一个值填充另一个文本字段