ファイル操作を行う Java プログラムがあり、コンソール出力がリダイレクトされる JTextArea を持つ GUI クラスがあります。別のクラスで SwingWorker を取得してその JTextArea に発行しようとしていますが、適切に動作させることができないようです。私の GUI クラスには、次のメソッドがあります。
public ShopUpdaterGUI() {
initComponents();
redirectSystemStreams();
}
private void updateTextArea(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
consoleTextAreaInner.append(text);
}
});
}
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
updateTextArea(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextArea(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
そして、仕事をする私の他のクラスでは、これがあります:
public void update(){
(updateTask = new UpdateTask()).execute();
}
private class UpdateTask extends SwingWorker<Void, String>{
@Override
protected Void doInBackground() {
try{
publish("Creating backup...");
mainBackup.createBackup();
publish("Setting restore point...");
setRestorePoint();
publish("Applying update...");
UPDHandler.unZipUpdate();
saveModifiedFilesList();
}catch(IOException ex){
ex.printStackTrace();
}catch(ClassNotFoundException ex){
ex.printStackTrace();
}finally{
publish("Update Complete!");
}
return null;
}
}
編集:ここで私のプロセス方法:
protected void process(List<String> updates){
String update = updates.get(updates.size() - 1);
System.out.println(update);
}
これは機能する場合もありますが、publish() 呼び出しの 1 つを完全にスキップする場合もあります。たとえば、publish("Setting restore point...") に到達すると、実際には JTextArea に表示されず、代わりに "Applying Update..." にスキップします。
JTextArea を公開して更新するように指示したときに正確にこれを取得するにはどうすればよいですか?