[英]Populating a JTable using ArrayList<String>
所以我嘗試使用我的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;
}
}
我的UI
我想用之前擁有的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
}
}
不要使用ArrayList。
String[] atoms = line.split("[#]");
//ArrayList<String> row = new ArrayList<String>();
model.addRow( atoms );
您已經在數組中存儲了數據。 您可以使用DefaultTableModel的addRow(...)方法,該方法將獲取數組中的數據並將數據添加到您的模型中。
因此,更改您的方法簽名。 而不是返回ArrayList,您應該返回DefaultTableModel。 然后,您可以使用模型創建JTable。
我可以看到的一個問題是ArrayList
的結構。 它只是一維的。 JTable
/ TableModel
數據必須是二維rows/columns
如果使getinformationforthetable()
返回ArrayList<ArrayList<String>>
則可以更輕松地填充表。
同樣,您也可以extends DefaultTableModel
。 我看不到您的AbstractTableModel
添加任何特殊功能。 然后,您可以使用DefaultTableModel
addRow
方法添加行。 像這樣
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()
,就像這樣
private static final String[] COLUMN_HEADERS =
{
"Title", "Artist", "Gengre", "Quality", "Duration","Favorite"
};
DefaultTableModel model = new DefaultTableModel(COLUMN_HEADERS, 0) {
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0: return String.class; break;
case 1: return String.class; break;
...
}
}
};
在您的示例中,您需要setTableModel
(應將其重命名為SetTableModel
以與Java樣式保持一致)來維護數據。 當前,您將數據保留在E
。
您可以像addRow(String)
一樣向SetTableModel
添加一個方法,該方法可以進行split
並將數據保留在SetTableModel
。
然后,當您覆蓋getValueAt(int row, int column)
,將從本地數據中提取。
另外, getColumnCount()
可能return COLUMN_HEADERS.length
而getRowCount()
應該返回本地數據中維護的行數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.