DafaultTableModel从文件读入到setValueAt(值、行、列)Java

DafaultTableModel从文件读入到setValueAt(值、行、列)Java,java,swing,file,defaulttablemodel,Java,Swing,File,Defaulttablemodel,我使用DefaultTableModel来显示一个简单的用户统计页面。我已成功地将数据保存到文件中,但无法将其读回(请参阅底部的loadData()method)。因此,我需要它做的是,当我启动程序时,它读取文件,设置模型的值,并在表中显示现有数据(在JPanel中)。 这是我的代码,它看起来“错了”,但我不知道在哪里。有人能给我提个醒吗?谢谢你 public class Statistics extends JPanel { public Object[][] data; pu

我使用DefaultTableModel来显示一个简单的用户统计页面。我已成功地将数据保存到文件中,但无法将其读回(请参阅底部的
loadData()
method)。因此,我需要它做的是,当我启动程序时,它读取文件,设置模型的值,并在表中显示现有数据(在JPanel中)。 这是我的代码,它看起来“错了”,但我不知道在哪里。有人能给我提个醒吗?谢谢你

public class Statistics extends JPanel {
    public Object[][] data;
    public DefaultTableModel model;
    public PrintWriter saveStats;

public Statistics() {
    super(new GridLayout(1,0));
    String[] columnNames = {"Name", "Games Played", "Games Won"};
    Object[][] data = {};
    model = new DefaultTableModel(data, columnNames);
    JTable table = new JTable(model);
    table.setFillsViewportHeight(true);
    table.setVisible(true);
    table.setEnabled(false);

    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);
}

public void addRow(Object[] objects) {
    model.addRow(objects);

}

public void updateGamesPlayed(String userFolderName, int gamesPlayed) {
    int rowCount = model.getRowCount();
    int columnCount = model.getColumnCount();

    for (int i = 0; i < rowCount; i++){
        for(int j = 0; j < columnCount; j++){
            if (model.getValueAt(i,j) == userFolderName){
                int count = (Integer) model.getValueAt(i, j+1);
                count += gamesPlayed;
                model.setValueAt(gamesPlayed, i, j+1);
            }
        }
    }
    saveGameStats(model);
}

public void saveGameStats(DefaultTableModel model){
    this.model = model;

    File gameStats;
    try {
        gameStats = new File("GameStats.txt");


    System.out.print(gameStats);

    saveStats = new PrintWriter(gameStats);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    for (int i = 0; i < model.getRowCount(); i++){
        for (int j = 0; j < model.getColumnCount(); j++){
            saveStats.print(model.getValueAt(i,j)+ " ");
        }
    }
    saveStats.close();
}

public void loadData() {
    String name = "";
    int games = 0;
    int won = 0;
    Scanner loadData = new Scanner("GameStats.txt");
    while(loadData.hasNextLine()){
        if (loadData.hasNext()){
              name = loadData.next();}
            else if (loadData.hasNextInt()){
              games = loadData.nextInt();}
            else if (loadData.hasNextInt()){
              won = loadData.nextInt();}
        for (int i = 0; i < model.getRowCount(); i++){
            for (int j = 0; j < model.getColumnCount(); j++){
                model.setValueAt(name,i,j);
                model.setValueAt(games, i, j+1);
                model.setValueAt(won, i, j+2);
            }
        }
    }

}
}
公共类统计扩展了JPanel{
公共对象[][]数据;
公共模型;
公共PrintWriter saveStats;
公共统计(){
超级(新网格布局(1,0));
String[]columnNames={“名称”、“玩过的游戏”、“赢过的游戏”};
对象[][]数据={};
模型=新的DefaultTableModel(数据、列名称);
JTable table=新的JTable(模型);
表.setFillsViewPerthweight(真);
表.setVisible(true);
表.setEnabled(假);
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
}
public void addRow(对象[]对象){
model.addRow(对象);
}
public void updateGamesPlayed(字符串userFolderName,int gamesPlayed){
int rowCount=model.getRowCount();
int columnCount=model.getColumnCount();
对于(int i=0;i
我想给你一些建议:

  • 正如本文所指出的,仍然有一个类变量
    data
    ,它被一个局部变量隐藏

  • 注意,您不需要
    对象[][]数据
    。您可以这样初始化您的
    DefaultTableModel
    model=newdefaulttablemodel(columnNames,0)并添加如下行:
    model.addRow(row)
    ,其中
    row
    是一个
    对象[]

  • 考虑使用
    SwingWorker
    将数据从文件加载到表模型。看看这个例子:

  • 考虑使用而不是
    扫描仪
    来使用方法读取文件。我可以从代码中推断,文件的每一行都是表中的一行。获取行,该字符串由空格组成(您将获得一个
    字符串[]
    ),并将结果添加到您的模型中:
    model.addRow()


    • 第一期:
      loadValue()
      函数中,当您尝试加载数据时,以下代码片段根本不起作用:

       for (int i = 0; i < model.getRowCount(); i++){
              for (int j = 0; j < model.getColumnCount(); j++){
                  model.setValueAt(name,i,j);
                  model.setValueAt(games, i, j+1);
                     // ArrayIndexOutOfBoundsException exception when j = 2
                  model.setValueAt(won, i, j+2); // same exception
      
              }
          }
      
      游戏
      获胜
      是整数的实例

      第二期
      Data[][]
      local to
      Statistics()
      正在隐藏在类上下文中声明的字段成员
      Data[][]
      。最好使用构造函数来创建模型。对于空表,
      rowCount
      0


      第三期:将数据保存(或加载)到另一个线程中,并从中更新Swing表。处理这项任务并不容易
      SingWorker
      是你的朋友。查看教程:

      感谢您的详细解释,我将研究SwingWorker:-)
      model.addRow(new Object[]{name, games, won})