我有一些代码需要几分钟来处理,它必须为长数组中的每个字符串连接到网络,每个字符串都是一个 url。我想让它每次连接时都应该刷新 jtextarea,这样用户就不会盯着看起来卡住 20 分钟的空白页面。或者需要多长时间。这是我尝试过但没有奏效的示例:
try {
ArrayList<String> myLinks = LinkParser.getmyLinksArray(jTextArea1.getText());
for (String s : myLinks) {
jTextArea2.append(LinkChecker.checkFileStatus(s) + "\n");
}
} catch (IOException ex) {
JOptionPane.showMessageDialog(jTextArea1, "Parsing Error", "Parsing Error", JOptionPane.ERROR_MESSAGE);
Logger.getLogger(MYView.class.getName()).log(Level.SEVERE, null, ex);
}
最佳答案
问题是您需要异步执行计算。您应该创建一个执行计算的后台线程,然后使用 SwingUtilities.invokeLater更新 JTextArea。
final ArrayList<String> myLinks = //... (new Thread() { public void run(){ for (String s : myLinks) { try{ final String result = LinkChecker.checkFileStatus(s) + "\n"; SwingUtilities.invokeLater(new Runnable(){ public void run(){ jtextArea2.append(result); } }); }catch(IOException error){ // handle error } } } }).start();
编辑
已经指出 JTextArea 的附加函数实际上是线程安全的(与大多数 Swing 函数不同)。因此,对于这种特殊情况,没有必要通过 invokeLater 更新它。但是,您仍然应该在后台线程中进行处理,以便让 GUI 更新,所以代码是:
final ArrayList<String> myLinks = //... (new Thread() { public void run(){ for (String s : myLinks) { try{ jtextArea2.append(LinkChecker.checkFileStatus(s) + "\n"); }catch(IOException error){ // handle error } } } }).start();
但是,对于几乎所有其他修改 Swing 对象的操作,您都需要使用 invokeLater(以确保修改发生在 GUI 线程中),因为几乎所有 Swing 函数都不是线程安全的。
关于java - 实时输出到jTextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2710712/