用另一个类的 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());
JComboBox
的 addItem()
方法需要 Object
作为参数。通常,String
对象用作参数。相反,当您真正想要添加列表中的每个项目时,您正在尝试将实际的列表引用添加到组合框。
相反,您应该在列表中添加单个项目,如下所示:
for(Stuff stuff : list)
box.addItem(stuff.getName());
编辑:再次阅读你原来的措辞问题,我认为你关于 GUI 的第二个代码 sn-p 不应该使用另一个 Stuff
的 ArrayList
如果你真的打算使用 @ 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的主要内容,如果未能解决你的问题,请参考以下文章