我正在尝试一些自我教导,正在开发一个小应用程序,它从文本文件中读取详细信息并在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);
}
}
答案 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
撰写的