DafaultTableModel从文件读入到setValueAt(值、行、列)Java
我使用DefaultTableModel来显示一个简单的用户统计页面。我已成功地将数据保存到文件中,但无法将其读回(请参阅底部的DafaultTableModel从文件读入到setValueAt(值、行、列)Java,java,swing,file,defaulttablemodel,Java,Swing,File,Defaulttablemodel,我使用DefaultTableModel来显示一个简单的用户统计页面。我已成功地将数据保存到文件中,但无法将其读回(请参阅底部的loadData()method)。因此,我需要它做的是,当我启动程序时,它读取文件,设置模型的值,并在表中显示现有数据(在JPanel中)。 这是我的代码,它看起来“错了”,但我不知道在哪里。有人能给我提个醒吗?谢谢你 public class Statistics extends JPanel { public Object[][] data; pu
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 toStatistics()
正在隐藏在类上下文中声明的字段成员Data[][]
。最好使用构造函数来创建模型。对于空表,rowCount
为0
第三期:将数据保存(或加载)到另一个线程中,并从中更新Swing表。处理这项任务并不容易
SingWorker
是你的朋友。查看教程:感谢您的详细解释,我将研究SwingWorker:-)
model.addRow(new Object[]{name, games, won})