如何解决自定义类和JLists
| 我正在Java项目的NetBeans中工作。 我需要在JList
中的ArrayList<State>
中显示每个State
(例如\“俄克拉荷马州\”)。
我不知道该怎么做...尤其是在NetBeans中。
我认为这涉及创建一个DefaultListModel
,每个State
作为String
。我已经尝试了一百万种不同的方法,但都没有成功。
是否可以只加载ArrayList<State>
(也许如果State
类具有toString()
方法)?这将特别有用,因为我可以通过actionPerformed()
直接修改ArrayList<State>
。
出于问题的考虑,让我们假设“ 0”是对象,类型为“ 5”的对象为“ 12”,类型为“ 15”的对象为“ 14”。
我希望这是有道理的。
谢谢。
解决方法
不幸的是,使用列表的JList唯一的“简单”初始化是通过Vector
Vector<State> myStates = new Vector();
//add states
JList list = new JList(myStates);
,最简单的解决方案是创建一个DefaultListModel,然后遍历ArrayList,将State对象添加到列表模型中。然后将此模型用作JList的模型。另一方面,如果您想在模型中使用ArrayList,则可能需要创建一个扩展AbstractListModel类的类,但要准备充实该类的更多方法,使其可以工作好。
,这里提供的所有答案都很好(+1)。在我看来,您最好创建自己的模型,以后可以在知道其工作原理的情况下轻松重用。
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
/**
*
* @author Konrad Borowiecki
*/
public class ObjectDataTableModel extends AbstractTableModel
{
private static final long serialVersionUID = 1L;
private List<String> columnNames = new ArrayList<String>();
private List<List<Object>> data = new ArrayList<List<Object>>();
public ObjectDataTableModel()
{
}
public void setColumnNames(List<String> cNames)
{
this.columnNames = cNames;
}
public void setData(List<List<Object>> dbData)
{
this.data = dbData;
}
public List<List<Object>> getData()
{
return data;
}
@Override
public void setValueAt(Object value,int row,int col)
{
List<Object> allRow = this.data.get(row);
allRow.set(col,value);
}
@Override
public boolean isCellEditable(int row,int col)
{
// if(col == 3){ //set column with id=3 to be not editable
// return false;
// }
return false;//true;
}
public boolean isDataNull()
{
if(this.data == null)
return true;
return false;
}
@Override
public int getColumnCount()
{
return columnNames.size();
}
@Override
public String getColumnName(int col)
{
return columnNames.get(col);
}
@Override
public int getRowCount()
{
return data.size();
}
@Override
public Object getValueAt(int row,int col)
{
if(data.get(row).isEmpty())
return null;
return data.get(row).get(col);
}
}
这里有一个非常简单的使用示例。
ObjectDataTableModel tm = new ObjectDataTableModel();
String[] columnNames = new String[]
{
\"1\",\"2\",\"3\"
};//,\"4\",\"5\",\"6\",\"7\"};
tm.setColumnNames(Arrays.asList(columnNames));
int rNo = 30;
List<List<Object>> data = new ArrayList<List<Object>>(rNo);
int cNo = columnNames.length;
for(int i = 0; i < rNo; i++)
{
List<Object> r = new ArrayList<Object>(cNo);
for(int j = 0; j < cNo; j++)
r.add(\"i=\" + i + \",j=\" + j);
data.add(r);
}
tm.setData(data);
我建议您始终在某个地方使用这样的模型,例如在实用程序包中,可用并可以使用。您将看到这种简单模型有用的频率。这是显示任何类型数据的理想选择。
祝一切顺利,博罗。
,我假设您在这里谈论Matisse GUI构建器,否则这应该是微不足道的。
首先,您需要创建自定义ListModel
public class StateListModel extends AbstractListModel{
private final List<State> list;
public StateListModel(List<State> list) {
this.list = list;
}
@Override
public int getSize() {
return list.size();
}
@Override
public Object getElementAt(int index) {
return list.get(index);
}
}
在类的构造函数中,在调用initComponents()之前初始化ListModel,并将其设置为字段而不是局部变量。
stateListModel = new StateListModel(myListofStates);
在NetBeans GUI构建器中,右键单击JLIst,然后选择“自定义代码”。
您将看到类似jList1.setModel(...)的内容,将下拉列表更改为custom属性并编辑代码以读取
jList1.setModel(stateListModel);
,所有这些答案都是很好的,并且肯定是有用的。我最终非常简单地从控制器解决了它:
view.getStatesList().setListData(model.getStates().toArray());
关键是使用.setListData()
(可以将Array作为参数)而不是.setModel()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。