-1

ファイル操作を行う 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 を公開して更新するように指示したときに正確にこれを取得するにはどうすればよいですか?

4

2 に答える 2

2

何も公開または処理しないでください。あなたの状況では、JTextArea は System.out からリダイレクトされた出力を受け取っているため、JTextArea に表示System.out.println(...)する必要があるテキストを呼び出すだけでよいようです。

private class UpdateTask extends SwingWorker<Void, String>{

    @Override
    protected Void doInBackground() {
        try{
            publish("Creating backup...");
            mainBackup.createBackup();

            // publish("Setting restore point...");
            System.out.println("Setting restore point...");

            setRestorePoint();

            // publish("Applying update...");
            System.out.println("Applying update...");

            UPDHandler.unZipUpdate();
            saveModifiedFilesList();

        }catch(IOException ex){
            ex.printStackTrace();
        }catch(ClassNotFoundException ex){
            ex.printStackTrace();
        }finally{
            publish("Update Complete!");
        }

        return null;
    }
}

バックグラウンド スレッドの使用を含むより完全な例については、この回答のコードを参照してください。

于 2013-11-05T17:17:44.790 に答える
2

publish(V... chunks)GUIスレッドで処理するdoInBackground()ためにデータを送信するために内部で使用されます。process(List<V> chunks)あなたが見逃したのは、プロセスメソッドをオーバーライドすることです:

@Override
 protected void process(List<String> chunks) {
     for (String s : chunks) {
         textArea.append(s + "\n");
     }
 }
于 2013-11-05T17:14:11.493 に答える