[英]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.