The below example will redirect the System.out to Java Swing text area. If want to redirect java.util.logging.Logger to Java Swing text area. Need override ConsoleHandler to setOutputStream(System.err); to setOutputStream(System.out);
Or update System.setOut(new PrintStream(new PipedOutputStream(outPipe), true));
to System.setErr(new PrintStream(new PipedOutputStream(outPipe), true));
package gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;
import java.util.List;
import java.util.Scanner;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
public class JConsole {
private static Logger logger = Logger.getLogger(JConsole.class.getName());
public static void main(String[] args) throws IOException {
JFrame frame = new JFrame("JConsole");
JTextArea jta = new JTextArea();
JButton button = new JButton("Run");
frame.setLayout(new BorderLayout());
frame.add(button,BorderLayout.NORTH);
frame.add(jta,BorderLayout.CENTER);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void, Object>(){
@Override
protected Void doInBackground() throws Exception {
outputTest("inner");
return null;
}}.execute();
}});
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
console(jta);
}
public static void outputTest(String msg){
for(int i=0;i<10;i++){
System.out.println(i+" "+msg);
logger.info("Test "+i);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public static void console(final JTextArea area) throws IOException {
final PipedInputStream outPipe = new PipedInputStream();
System.setOut(new PrintStream(new PipedOutputStream(outPipe), true));
new SwingWorker<Void, String>() {
@Override
protected Void doInBackground() throws Exception {
Scanner s = new Scanner(outPipe);
while (s.hasNextLine()){
String line = s.nextLine();
publish(line + "\n");
}
s.close();
return null;
}
@Override
protected void process(List<String> chunks) {
for (String line : chunks){
area.append(line);
}
}
}.execute();
}
}
No comments:
Post a Comment