【问题标题】:Java - JTable show only last line from txt fileJava - JTable 仅显示 txt 文件的最后一行
【发布时间】:2017-09-10 20:13:33
【问题描述】:

我有这样的txt文件:

User User 1||Address1|telephonecall|X|drivingdepartment|vehicle|X
User User 2||Address2|telephonecall|X|drivingdepartment|vehicle|X
User User 3||Address3|telephonecall|X|drivingdepartment|vehicle|X
User User 4||Address4|telephonecall|X|drivingdepartment|vehicle|X

我试图像这样在 JTable 中显示它,但它只显示最后一行 4 次(与文本文件中的行数一样多)

    public ArrayList<Voznje> ucitajVoznje() {
        ArrayList<Voznje> zakazaneVoznje = new ArrayList<Voznje>();
        try {
            File voznjeFile = new File("src/txt/voznje");
            BufferedReader br = new BufferedReader(new FileReader(voznjeFile));
            String line = null;
            while ((line = br.readLine()) != null) {
                String[] split = line.split("\\|");
                String imePrezimeMusterije = split[0];
                String datumPolaska = split[1];
                String adresaPolaska = split[2];
                String nacinPorudzbine = split[3];
                String vozac = split[4];
                String dispecer = split[5];
                String vrstaVozila = split[6];
                String napomena = split[7];

                Voznje novaVoznja = new Voznje(imePrezimeMusterije, datumPolaska, adresaPolaska, nacinPorudzbine, vozac, dispecer, vrstaVozila, napomena);
                zakazaneVoznje.add(novaVoznja);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //System.out.println(zakazaneVoznje);
        return zakazaneVoznje;
    }
 private void initGUI() {
        ArrayList<Voznje> zakazaneVoznje = ucitajVoznje();
        String[] zaglavlje = new String[] {"Musterija", "Datum", "Adresa", "Rezervacija", "Vozac", "Dispecer", "Vrsta vozila", "Napomena"};
        Object[][] prikaz = new Object[zakazaneVoznje.size()][zaglavlje.length];    
        int a = 0;
        for (int i = 0; i < zakazaneVoznje.size(); i++){
            for (Voznje v : zakazaneVoznje) {
                prikaz[i][0] = v.getImePrezimeMusterije();
                prikaz[i][1] = v.getDatumPolaska();
                prikaz[i][2] = v.getAdresaPolaska();
                prikaz[i][3] = v.getNacinPorudzbine();
                prikaz[i][4] = v.getVozac();
                prikaz[i][5] = v.getDispecer();
                prikaz[i][6] = v.getVrstaVozila();
                prikaz[i][7] = v.getNapomena();

            }
        }

        DefaultTableModel tableModel = new DefaultTableModel(prikaz,zaglavlje);
        tblVoznje = new JTable(tableModel);
        tblVoznje.setRowSelectionAllowed(true);
        tblVoznje.setColumnSelectionAllowed(true);
        tblVoznje.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tblVoznje.setDefaultEditor(Object.class, null);

        JScrollPane tableScroll = new JScrollPane(tblVoznje);
        add(spSkrol);
        add(tbTulbar, BorderLayout.NORTH);
        add(tableScroll, BorderLayout.CENTER);

当然,我想显示每一行,但它看起来像这样......:

我想问题出在 for 循环的某个地方...

【问题讨论】:

  • 您的嵌套 for 循环没有意义。你为什么要这样做?
  • (1-) 为什么你觉得听取建议这么难???请参阅:stackoverflow.com/questions/46122350/…(您还删除了另一个给出相同建议的问题),简单的建议是拆分行并使用 addRow(...) 方法将数组添加到 TableModel 中。 这是循环内的 2 个语句!!!
  • 现在您将数据拆分为一个数组。然后,您将所有数据复制到自定义对象。然后遍历 ArrayList 并从自定义对象中获取数据并将其添加到 2D 数组中。然后创建 DefaultTableModel。 DefaultTableModel 然后将数据从数组复制到向量的向量。您有不必要的复杂代码以及 4 个数据副本。

标签: java swing jtable text-files


【解决方案1】:

这是因为您在每次迭代中都使用所有主题填充数据

for (int i = 0; i < zakazaneVoznje.size(); i++){
    for (Voznje v : zakazaneVoznje) { // HERE IS THE MISTAKE
        prikaz[i][0] = v.getImePrezimeMusterije();
        prikaz[i][1] = v.getDatumPolaska();
        prikaz[i][2] = v.getAdresaPolaska();
        prikaz[i][3] = v.getNacinPorudzbine();
        prikaz[i][4] = v.getVozac();
        prikaz[i][5] = v.getDispecer();
        prikaz[i][6] = v.getVrstaVozila();
        prikaz[i][7] = v.getNapomena();

    }
}

应该是

for (int i = 0; i < zakazaneVoznje.size(); i++){
    Voznje v=zakazaneVoznje.get(i)
        prikaz[i][0] = v.getImePrezimeMusterije();
        prikaz[i][1] = v.getDatumPolaska();
        prikaz[i][2] = v.getAdresaPolaska();
        prikaz[i][3] = v.getNacinPorudzbine();
        prikaz[i][4] = v.getVozac();
        prikaz[i][5] = v.getDispecer();
        prikaz[i][6] = v.getVrstaVozila();
        prikaz[i][7] = v.getNapomena();
}

【讨论】:

  • 嗯,这可能会解决问题,但真正的问题是代码的糟糕结构和所有不必要的循环。我希望 OP 花时间阅读我的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多