[英]Why Output to JTextArea in real-time doesn't show up?
我使用JTextArea顯示解壓縮文件的狀態。 但是由於某種原因,它不顯示附加的文本。 有人可以提出解決方案嗎?
public class UnzipFile extends Thread{
private static FtpTabPanel panel;
private File archive,outputDir;
public UnzipFile(File archive, File outputDir, FtpTabPanel panel) {
UnzipFile.panel = panel;
this.archive = archive;
this.outputDir = outputDir;
}
@Override
public void run() {
super.run();
unzipArchive();
}
public void unzipArchive() {
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) e.nextElement();
unzipEntry(zipfile, entry, outputDir);
}
panel.statusTextArea.append(String.valueOf(System.currentTimeMillis()));
} catch (Exception e) {
OeExceptionDialog.show(e);
}
}
private void unzipEntry(ZipFile zipfile, final ZipEntry entry, File outputDir) {
if (entry.isDirectory()) {
createDir(new File(outputDir, entry.getName()));
return;
}
File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists()){
createDir(outputFile.getParentFile());
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
panel.statusTextArea.append("Extracting: " + entry + "\n");
}
});
try {
BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
IOUtils.copy(inputStream, outputStream);
outputStream.close();
inputStream.close();
}catch (IOException io){
OeExceptionDialog.show(io);
}catch (NullPointerException n){
OeExceptionDialog.show(n);
}catch (ArithmeticException a){
OeExceptionDialog.show(a);
}
}
}
在下面的代碼中,我使用了SwingWorkers,但它僅將zip文件中的一項解壓縮,而jtextArea中沒有任何內容
public class UnzipWorkers extends SwingWorker<String,Void> {
private WebTextArea statusTextArea;
private File archive,outputDir;
public UnzipWorkers(WebTextArea statusTextArea,File archive,File outputDir) {
this.archive=archive;
this.outputDir=outputDir;
this.statusTextArea = statusTextArea;
}
@Override
protected String doInBackground() throws Exception {
statusTextArea.append(String.valueOf(System.currentTimeMillis()));
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) e.nextElement();
String status = unzipEntry(zipfile, entry, outputDir);
return status;
}
} catch (Exception e) {
OeExceptionDialog.show(e);
}
return null;
}
@Override
protected void done() {
super.done();
try {
statusTextArea.append( get() + "\n");
FileTreePanel.btnRefresh.doClick();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
private String unzipEntry(ZipFile zipfile, final ZipEntry entry, File outputDir) {
String success = "Extracted failed: "+ entry + "\n";
if (entry.isDirectory()) {
createDir(new File(outputDir, entry.getName()));
}
File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists()){
createDir(outputFile.getParentFile());
}
try {
BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
IOUtils.copy(inputStream, outputStream);
outputStream.close();
inputStream.close();
success="Extracted successfully: " + entry + "\n";
}catch (IOException io){
OeExceptionDialog.show(io);
}catch (NullPointerException n){
OeExceptionDialog.show(n);
}catch (ArithmeticException a){
OeExceptionDialog.show(a);
}
return success;
}
private void createDir(File dir) {
if (!dir.exists()) {
try {
dir.mkdirs();
} catch (RuntimeException re) {
OeExceptionDialog.show(re);
}
}
}
}
從這一行來看:
panel.statusTextArea.append(String.valueOf(System.currentTimeMillis()));
您正在EDT上運行代碼,否則將收到IllegalThreadAccess異常。 因此,實際上,整個提取過程都是作為單個事件的處理完成的。 您更新TextArea的請求僅被推送到事件隊列,並在那里等待,直到您完成“處理”觸發提取代碼的事件。
您必須在專用線程上運行代碼(使用SwingWorker)。
您是否嘗試過移動
panel.statusTextArea.append(String.valueOf(System.currentTimeMillis()));
循環內?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.