基本上,我有一种方法可以从文本文件中读取数据并将行添加到 jTable
。这已得到处理,一切正常。我要的是加行效果。我希望 jTable 逐行添加而不是一次添加所有行。
我使用 java.swing.Timer 找到了类似的解决方案,但它对我不起作用。
所以下面我有一个方法可以从文本文件中读取,添加到 jTable 和计时器以暂停每一行的插入行过程(我的预期目的)。计时器工作正常,但不是延迟行,而是延迟整个表。所以当我点击按钮时,表格等待 2 秒并吐出整行。我怎样才能像 peekillet 的更新#2 那样实现逐行添加效果。任何帮助将不胜感激!
private void addActionPerformed(java.awt.event.ActionEvent evt) {
addData();
}
public void addData(){
Timer timer = new Timer(2000, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try {
FileInputStream fstream = new FileInputStream("\\data.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String line;
DefaultTableModel model = (DefaultTableModel) resultTable.getModel();
while((line = br.readLine()) != null){
model.addRow(new Object[]{line});
//System.out.println(strLine);
}
fstream.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(PIIFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(PIIFrame.class.getName()).log(Level.SEVERE, null, ex);
}
repaint();
}
});
timer.setRepeats(false);
timer.start();
}
最佳答案
Timer
的操作处理程序在 EDT 上执行,这意味着您在读取文件时会阻止 EDT。在这种情况下,计时器唯一做的就是将文件读取延迟 2 秒。
您不需要计时器来执行此操作,您可以改为执行类似的操作。
public void addData(){
final DefaultTableModel model = (DefaultTableModel) resultTable.getModel();
new Thread(new Runnable(){
public void run(){
FileInputStream fstream = null;
try {
fstream = new FileInputStream("\\data.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String line;
while((line = br.readLine()) != null){
final String ln = line;
SwingUtilities.invokeAndWait(new Runnable(){
// run on EDT thread.
public void run(){
model.addRow(new Object[]{ln});
}
});
synchronized(Thread.currentThread()){
Thread.currentThread().wait(2000);// pause for 2 second.
}
}
} catch (FileNotFoundException ex) {
...
} catch (IOException ex) {
....
} finally {
if(fstream!=null){
try{
fstream.close();
}catch (IOException e) {
....
}
}
}
}
}).start();
}
关于java - 如何阻止 jTable 一次添加所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37444558/