所以我尝试使用我的arraylist填充jtable,我也想保留3层架构
我的DAL 我从文件中读取数据并尝试将其填充到表中
public class E {
public ArrayList<String> getinformationforthetable() {
Scanner s = null;
ArrayList<String> data = new ArrayList<String>();
try {
s = new Scanner(new File("songs.txt"));
while (s.hasNextLine()) {
String line = s.nextLine();
if (line.startsWith("")) {
String[] atoms = line.split("[#]");
ArrayList<String> row = new ArrayList<String>();
row.add(atoms[0]);
row.add(atoms[1]);
row.add(atoms[2]);
row.add(atoms[3]);
row.add(atoms[4]);
row.add(atoms[5]);
data.addAll(row);
}
}
}
catch(IOException e) {
e.printStackTrace();
}
finally {
if (s != null) {
s.close();
}
}
return data;
}
}
我的用户界面
我想用之前的arraylist填充表模型,但我不知道该怎么做。
public class setTableModel extends AbstractTableModel{
private static final String[] COLUMN_HEADERS =
{
"Title", "Artist", "Gengre", "Quality", "Duration","Favorite"
};
private static final Class[] COLUMN_TYPES =
{
String.class, String.class,String.class,String.class, Integer.class, Boolean.class
};
@Override
public int getRowCount() {
return COLUMN_HEADERS.length;
}
@Override
public int getColumnCount() {
return null;
//todo
}
@Override
public Object getValueAt(int i, int i1) {
return null;
//todo
}
}
答案 0 :(得分:4)
不要使用ArrayList。
String[] atoms = line.split("[#]");
//ArrayList<String> row = new ArrayList<String>();
model.addRow( atoms );
您已经拥有数组中的数据。您可以使用DefaultTableModel的addRow(...)方法,该方法将获取数组中的数据并将数据添加到模型中。
因此请更改您的方法签名。而不是返回ArrayList,您应该返回DefaultTableModel。然后,您可以使用该模型来创建JTable。
答案 1 :(得分:3)
我可以看到你遇到的一个问题是ArrayList
的结构。它只是一维的。 JTable
/ TableModel
中的数据需要为二维rows/columns
如果您让getinformationforthetable()
返回ArrayList<ArrayList<String>>
,那么您就可以更轻松地填充表格。
你也可以extends DefaultTableModel
。我没有看到AbstractTableModel
添加任何特殊功能。然后,您可以使用addRow
的{{1}}方法添加行。像这样的东西
DefaultTableModel
或者甚至根本不延伸DefaultTableModel model = new MyDefaultTableModel();
E e = new E();
ArrayList<ArrayList<String>> list = e.getinformationforthetable();
for (ArrayList<String> row : list) {
model.addRow(row.toArray());
}
table.setModel(model);
。您可以覆盖它的DefaultTableModel
,类似这样的
getColumnClass()
答案 2 :(得分:2)
在您的示例中,您需要setTableModel
(您应该将其重命名为SetTableModel
以与Java样式保持一致)以维护数据。目前,您将数据保存在E
中。
您可以向SetTableModel
addRow(String)
添加方法,该方法可以执行split
并将数据保存在SetTableModel
内。
然后,当您覆盖getValueAt(int row, int column)
时,您将从本地数据中提取。
此外,getColumnCount()
可return COLUMN_HEADERS.length
和getRowCount()
应返回本地数据中维护的行数。