[英]How to display records in a JTable from an arraylist .TXT file in java MVC?
目前,這是我的主屏幕: )我有2個文件:“ Patient.txt”和“ treatment.txt”,其中包含多個患者和治療的記錄。
我想做的是,每當我單擊“顯示治療”或“顯示患者”時,都在一個漂亮的JTable中顯示所有這些記錄,如下所示:
我正在為此醫院管理系統使用MVC模型(帶有HMSGUIModel.java,HMSGUIView.java,HMSGUIController.java,HMSGUIInterface.java文件),並使用以下代碼添加記錄:
FileWriter tfw = new FileWriter(file.getAbsoluteFile(), true);
BufferedWriter tbw = new BufferedWriter(tfw);
tbw.write(this.view.gettNumber() + "," + this.view.gettName() + "," + this.view.gettDoctor() + "," + this.view.gettRoom());
tbw.newLine();
tbw.flush();
JOptionPane.showMessageDialog(null, "Successfully added treatment!"); }
請幫助我如何添加閱讀器,以顯示從文本文件到表的所有記錄?
提前謝謝了!!
與您的MVC保持一致,您可以創建一個TableModel
,它知道如何讀取給定的患者記錄。
不過,就我個人而言,我更願意將患者數據的管理與視圖分開,因此視圖並不在乎數據的來源。
為此,我將從創建一個Patient
對象和Treatment
對象開始,這些對象會將數據保存在一個自包含的實體中,從而使管理更加簡單。
您將需要讀取這些數據並解析結果...
List<Treatment> treatments = new ArrayList<Treatment>(25);
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String text = null;
while ((text = br.readline()) != null) {
String parts[] = text.split(",");
Treatmeant treament = new Treatment(parts[0],
parts[1],
parts[2],
parts[3]);
treatments.add(treament);
}
} // Handle exception as required...
我將其包裝到某些實用程序類的readTreatments
方法中,以使其更易於使用...
在這附近,我會考慮使用一個獨立的數據庫,甚至是一個XML文檔,但這只是我一個人。
一旦有了這個,就可以設計一個TableModel
來支持它。
public class TreatmentTableModel extends AbstractTableModel {
protected static final String[] COUMN_NAMES = {
"Treatment-Number",
"Treatment-Name",
"Doctor-in-charge",
"Room-No",
};
protected static final Class[] COLUMN_CLASSES = new Class[]{
Integer.class,
String.class,
Doctor.class,
Integer.class,
};
private List<Treatment> treatments;
public TreatmentTableModel() {
this.treatments = new ArrayList<>();
}
public TreatmentTableModel(List<Treatment> treatments) {
this.treatments = new ArrayList<>(treatments);
}
@Override
public int getRowCount() {
return treatments.size();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public String getColumnName(int column) {
return COUMN_NAMES[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return COLUMN_CLASSES[columnIndex];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Treatment treatment = treatments.get(rowIndex);
Object value = null;
switch (columnIndex) {
case 0:
value = treatment.getNumber();
break;
case 1:
value = treatment.getName();
break;
case 2:
value = treatment.getDoctor();
break;
case 3:
value = treatment.getRoomNumber();
break;
}
return value;
}
}
然后,您只需將其應用於所需的JTable
...
private JTable treatments;
//...
treatments = new JTable(new TreatmentTableModel());
add(new JScrollPane(treatments));
然后,我們需要加載Treatment
List
並將其應用於表...
File file = new File("...");
treatments.setModel(new TreatmentTableModel(TreatmentUtilities.readTreatments(file)));
根據表的需求,您可以查看使用DefaultTableModel
並使用該模型填充數據。 缺點是,您可能希望表具有特殊功能,例如無法編輯單元格,存儲多於字符串等...在這種情況下,您可能需要擴展AbstractTableModel
並為模型定義自己的行為。
一個簡單的事情就是從默認模型開始並在此基礎上進行擴展。
String[] myColumns = {"Treatment-Number","Treatment-Name", "Doctor-in-charge", "Room-No"};
// init a model with no data and the specified column names
DefaultTableModel myModel = new DefaultTableModel(new Object[myList.size()][4](), myColumns);
// assuming you have a list of lists...
int i = 0;
int j = 0;
for (ArrayList<Object> list : myList) {
for ( Object o : list ) {
myModel.setValueAt(o, i, j); // set the value at cell i,j to o
j++;
}
i++;
}
JTable myTable = new JTable(myModel); // make a new table with the specified data model
// ... do other stuff with the table
如果要訪問表數據,請使用myTable.getModel()
並更新數據。 這將自動更新表的視圖(完成MVC連接)
在此處查找有關使用表的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.