【问题标题】:How to display records in a JTable from an arraylist .TXT file in java MVC?java - 如何从java MVC中的arraylist .TXT文件显示JTable中的记录?
【发布时间】:2014-07-18 04:30:38
【问题描述】:

目前,这是我的主屏幕: () 我有 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!"); }

请帮助我如何添加阅读器,以将文本文件中的所有记录显示到表格中?

提前非常感谢!!

【问题讨论】:

    标签: java swing model-view-controller arraylist jtable


    【解决方案1】:

    与您的 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));
    

    然后,我们需要,您将加载Treatments 的List 并将其应用到表...

    File file = new File("...");
    treatments.setModel(new TreatmentTableModel(TreatmentUtilities.readTreatments(file)));
    

    【讨论】:

    • 谢谢...让我困惑的部分是在哪里添加每段代码。我应该在模型中添加哪一部分,在视图中添加哪一部分,在控制器中添加哪一部分?
    • 想想吧。您的“模型”需要向视图提供关于要显示什么的信息,因此它需要提供一些方法来让视图获取当前的TreatmentList。 “控制器”知道用户何时更改了视图(或想要更改视图),因此它需要告诉“模型”何时加载新数据或自己加载新数据并将该信息传递给“模型”。然后模型将触发更新,提醒视图重新加载 JTable 的模型,其中包含已加载的新值
    • 我不明白!已经有太多代码了,我把所有东西都搞混了:(
    • 如果不深入了解您的过度代码,就很难提出建议。如果您打算用JTable 替换您的当前视图,那么您需要提供一些方法来让该视图生成(子)表模型。这表明您当前的模型需要提供一些方法来提供 ListTreatements...
    【解决方案2】:

    根据您对表格的需求,您可以查看使用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 连接)

    查看here 了解有关使用表格的更多信息。

    【讨论】:

    • 表格模型您的模型。视图是 JTable,控制器将是您添加此代码的位置(或让您的“视图”类创建表模型的代码)。这实际上取决于您如何分解代码,但是创建和更新 UI 元素的类将是您可能将用于在表中传递/获取数据的创建和更新方法以及用于处理来自用户的事件并更新表模型。
    • 我还是不明白!已经有太多代码了,我把所有东西都搞混了:(
    • 听起来你可能对 MVC 没有足够的把握,无法在不混淆的情况下应用任何关于这个问题的建议。尝试查看this tutorial,看看是否可以为您解决任何问题。没有看到您的代码,很难进一步提供帮助......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多