【问题标题】:JTable does not show Object [][] dataJTable 不显示 Object[][] 数据
【发布时间】:2016-09-20 11:58:33
【问题描述】:

我需要一些关于 JTable 的帮助。我正在尝试从“Contact.txt”文件中读取数据并使用该数据填充我的表。我可以通过添加到 Object[][] 2D 数组来正确地从文件中获取数据没有任何问题。当我尝试将此对象数组添加到表中时不会发生任何事情。 对不起我的英语不好。

Contacts.txt 文件包括“姓名”、“姓氏”、“电话号码”、“电子邮件”等。

这个类读取文本并将其添加到 Object :

public class ReadFromText {

public boolean ReadTable(Object [][] data) {

    boolean status = false;

    File file = new File("/Users/MacbookPro/Documents/Contacts.txt");
    BufferedReader bf = null;
    FileReader fileReader = null;
    try {
        fileReader = new FileReader(file);
        bf = new BufferedReader(fileReader);

        String textLine = null;
        String [] text = null;

        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < 4; j++) {
                while ((textLine = bf.readLine()) != null) {
                    text = textLine.split("    ");
                    data[i][j] = text[j];
                    status = true;
                    System.out.println(data[i][j]);
                }
            }
        }
        bf.close();

    } catch (IOException e) {
        System.err.println(e.getMessage());
    }
    return status;
}
}

这部分代码来自ma​​in Class

Object [][]datas = new Object[10][4];

ReadFromText r = new ReadFromText(); //new object from ReadData class
    if(r.ReadTable(datas)== true){ 
        System.out.println("OK");//just for to be sure
    }else{
        System.out.println("NO");
    }
    model = new DefaultTableModel(datas, columNames);
    table = new JTable(model);
    table.setFont(new Font("Monospaced", Font.PLAIN, 13));
    table.setBackground(new Color(245, 245, 245));
    table.setRowHeight(25);
    table.setMinimumSize(new Dimension(60, 20));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

here返回“OK”检查它

但是 JTable 是空的!!! : 看this picture

我希望任何人都可以帮助我。感谢所有人

【问题讨论】:

  • 打印出数据会得到什么?
  • @c0der 感谢重播,但我试过了。你可以从第二张图片中看到结果

标签: java arrays swing file-io jtable


【解决方案1】:

您从文件中读取数据的代码有误。想一想。以 0 值启动外循环,然后以 0 值启动内循环,然后使用 while 循环读取整个文件。

您希望您的逻辑读取单行数据,拆分该行并添加,然后将数据添加到数组中。所以逻辑应该是这样的:

int row = 0;

while ((String textLine = bf.readLine()) != null) 
{
    String text = textLine.split("    ");

    for (int i = 0; i < text.length; i++)
    {
         data[row][i] = text[i];
    }

    row++
}

但是,您不应该使用数组来保存数据。您永远不应该硬编码数据结构的大小,因为它不允许您添加新数据。相反,您应该使用 Vector 来读取数据。那么你有 10 行数据还是 100 行都没关系。

使用这种方法,代码将类似于:

Vector data = new Vector();

while ((String textLine = bf.readLine()) != null) 
{
    String text = textLine.split("    ");
    Vector row = new Vector();

    for (int i = 0; i < text.length; i++)
    {
         row.addElement( text[i] );
    }
}

因此您需要更改方法以返回数据向量。您还需要更改要添加到 Vector 的“columnNames”,以便您可以使用两个 Vector 创建 TableModel。

【讨论】:

  • 非常感谢。现在它可以工作了,但它只是填充了第一列。现在我正在尝试以正确的方式拆分它。
  • @CoderACJHP, Now it working but it just filling first columns - 在我的“未经测试”代码中,数据数组中的列索引从未改变。有关更改列的一种方法,请参见编辑。这是使用向量的另一个原因,因为您不必担心索引。
【解决方案2】:

我希望这个答案能帮助您找到问题所在。它还旨在证明发布MCVE 的重要性,如下所示:

导入 java.awt.Color; 导入 java.awt.Dimension; 导入 javax.swing.JFrame; 导入 javax.swing.JScrollPane; 导入 javax.swing.JTable; 导入 javax.swing.table.DefaultTableModel;

public class TestTable extends JFrame  {

    public TestTable() {

        super("Main");
        setSize(400, 300);

        Object [][]datas = new Object[][]{
            {"A1", "A2","A3","A4"},
            {"B1", "B2","B3","B4"}
        };

        Object[] columNames = {"Name","LastName","Phone Num","Email"};
        DefaultTableModel    model = new DefaultTableModel(datas, columNames );
        JTable table = new JTable(model);
        table.setBackground(new Color(245, 245, 245));
        table.setRowHeight(25);
        table.setMinimumSize(new Dimension(60, 20));
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

        add(new JScrollPane(table));

        setVisible(true);
    }

    public static void main(String[] args) {
        new TestTable();
    }
}

MCVE 不仅可以帮助您获得更好和更快的响应,在很多情况下,例如这个,它还可以帮助您找出问题并自行解决。 删除所有对重现问题不是必需的内容,帮助您(以及试图帮助的人)专注于问题所在。 在这种情况下,您可以看到消除输入部分,您可以看到 JTable 工作正常。

【讨论】:

  • 感谢您的重播。我在填充 2d 数组时遇到的问题,当尝试将 while((text = bf.readLine()) !=){} 移出 2 个 for 循环时,我得到这样的结果:[Ljava.lang.String;@3ede05c0
  • 我知道问题出在那儿。这就是为什么我发表评论“当你打印出数据时你会得到什么?”
  • 我得到正确的数据一切正常,但表格仍然是空的。之后我们用 Mr.@camickr 解决了一半的问题 :) 现在只有第一列填充并且需要解决这个问题。也许需要使用不同的正则表达式拆分?你对此有什么想法吗? “只是填充第一列”谢谢
  • “我得到了正确的数据”——我对此表示怀疑。 1.在模型使用前打印出来。你可能会感到惊讶。 2.如果数据 100% 已检查,请使用minimal reproducible example 发布另一个问题
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多