How to set output stream in TextArea

I am trying to create a GUI panel for a program, and I would like everything that was normally printed on my command line to be printed for the TextArea object. I have a GUI panel formatted for the most part, I cannot get text to print in TextArea, although here is my file:

package guipanel; import javax.swing.*; import java.awt.*; import java.io.*; /** * * @author Dan */ public class GUIPanel extends JFrame { public GUIPanel() { initComponents(); } private void setOutputStream(boolean catchErrors) { System.setOut(aPrintStream); setVisible(true); requestFocus(); if (catchErrors) { System.setErr(aPrintStream); } } private void addTabs(JTabbedPane jTabbedPane1) { JPanel jPanel1 = new JPanel(); JPanel jPanel2 = new JPanel(); JPanel jPanel3 = new JPanel(); JPanel jPanel4 = new JPanel(); jTabbedPane1.add("Main", textArea1); jTabbedPane1.add("Commands", jPanel); jTabbedPane1.add("Rules", jPanel1); jTabbedPane1.add("Links", jPanel2); jTabbedPane1.add("Information", jPanel3); jTabbedPane1.add("Shutdown", jPanel4); setOutputStream(true); } @SuppressWarnings("unchecked") private void initComponents() { textArea1 = new java.awt.TextArea(); jTabbedPane1 = new javax.swing.JTabbedPane(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenu2 = new javax.swing.JMenu(); textArea1.setPreferredSize(new java.awt.Dimension(432, 343)); textArea1.getAccessibleContext().setAccessibleParent(jTabbedPane1); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Evolution-X 639"); setBounds(new java.awt.Rectangle(0, 0, 400, 450)); setResizable(false); getContentPane().setLayout(new java.awt.FlowLayout()); addTabs(jTabbedPane1); getContentPane().add(jTabbedPane1); jMenu1.setText("File"); jMenuBar1.add(jMenu1); jMenu2.setText("Edit"); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1); pack(); } public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(GUIPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new GUIPanel().setVisible(true); } }); } private JMenu jMenu1; private JMenu jMenu2; private JMenuBar jMenuBar1; private JTabbedPane jTabbedPane1; private TextArea textArea1; private JPanel jPanel = new JPanel(); private PrintStream aPrintStream = new PrintStream( new FilterOutputStream( new ByteArrayOutputStream())); } 
+8
java user-interface swing jframe jtextarea
source share
4 answers

You need to redirect the print stream to an output stream that you can control ...

This is an example of a concept that I developed for an application I'm working on to work. We use this to output the output console when it runs on user sites so that we can see what is being sent to the standard ... until we commit our log :.

It basically puts a custom OutputStream between the print stream and the console to capture output, but it still allows you to print content to the console. This is useful if you run the program from the command line or the IDE. You can put a switch to stop this if you want ...

enter image description here

 public class TestRedirect { public static void main(String[] args) { new TestRedirect(); } public TestRedirect() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } CapturePane capturePane = new CapturePane(); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(capturePane); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); PrintStream ps = System.out; System.setOut(new PrintStream(new StreamCapturer("STDOUT", capturePane, ps))); System.out.println("Hello, this is a test"); System.out.println("Wave if you can see me"); } }); } public class CapturePane extends JPanel implements Consumer { private JTextArea output; public CapturePane() { setLayout(new BorderLayout()); output = new JTextArea(); add(new JScrollPane(output)); } @Override public void appendText(final String text) { if (EventQueue.isDispatchThread()) { output.append(text); output.setCaretPosition(output.getText().length()); } else { EventQueue.invokeLater(new Runnable() { @Override public void run() { appendText(text); } }); } } } public interface Consumer { public void appendText(String text); } public class StreamCapturer extends OutputStream { private StringBuilder buffer; private String prefix; private Consumer consumer; private PrintStream old; public StreamCapturer(String prefix, Consumer consumer, PrintStream old) { this.prefix = prefix; buffer = new StringBuilder(128); buffer.append("[").append(prefix).append("] "); this.old = old; this.consumer = consumer; } @Override public void write(int b) throws IOException { char c = (char) b; String value = Character.toString(c); buffer.append(value); if (value.equals("\n")) { consumer.appendText(buffer.toString()); buffer.delete(0, buffer.length()); buffer.append("[").append(prefix).append("] "); } old.print(c); } } } 

enter image description hereenter image description here

Updated by working example. Test on Windows 7, Java 6, and Mac OS Lion Java 7

+20
source share

MadProgrammer's solution is really great, and I based it on my own. However, as Loopkin pointed out, it does not deal with special characters (to be precise, it fails with every character other than ASCII).

The Loopkin solution did not work for me, but I finally came up with 2 solutions that did the job.

Solution 1: processes every 1 byte character (up to U + 00FF)

This simple solution processes every character up to U + 00FF (every 1-byte character). Everything is identical to MadProgrammer, except write() , which is defined as:

 @Override public void write(int b) throws IOException { buffer.append(Character.toChars((b + 256) % 256)); if ((char) b == '\n') { textArea.append(str); textArea.setCaretPosition(textArea.getDocument().getLength()); buffer.delete(0, buffer.length()); } old.write(b); } 

I did not put a prefix because I do not need it.

Solution 2: processes each object as standard output

In the end, I decided to include all characters, so I ended up directly extending PrintStream and also returned the prefix / indent. The problem is that I could not override the private write(String s) method, so I tried all the print() methods:

 public class PrintStreamCapturer extends PrintStream { private JTextArea text; private boolean atLineStart; private String indent; public PrintStreamCapturer(JTextArea textArea, PrintStream capturedStream, String indent) { super(capturedStream); this.text = textArea; this.indent = indent; this.atLineStart = true; } public PrintStreamCapturer(JTextArea textArea, PrintStream capturedStream) { this(textArea, capturedStream, ""); } private void writeToTextArea(String str) { if (text != null) { synchronized (text) { text.setCaretPosition(text.getDocument().getLength()); text.append(str); } } } private void write(String str) { String[] s = str.split("\n", -1); if (s.length == 0) return; for (int i = 0; i < s.length - 1; i++) { writeWithPotentialIndent(s[i]); writeWithPotentialIndent("\n"); atLineStart = true; } String last = s[s.length - 1]; if (!last.equals("")) { writeWithPotentialIndent(last); } } private void writeWithPotentialIndent(String s) { if (atLineStart) { writeToTextArea(indent + s); atLineStart = false; } else { writeToTextArea(s); } } private void newLine() { write("\n"); } @Override public void print(boolean b) { synchronized (this) { super.print(b); write(String.valueOf(b)); } } @Override public void print(char c) { synchronized (this) { super.print(c); write(String.valueOf(c)); } } @Override public void print(char[] s) { synchronized (this) { super.print(s); write(String.valueOf(s)); } } @Override public void print(double d) { synchronized (this) { super.print(d); write(String.valueOf(d)); } } @Override public void print(float f) { synchronized (this) { super.print(f); write(String.valueOf(f)); } } @Override public void print(int i) { synchronized (this) { super.print(i); write(String.valueOf(i)); } } @Override public void print(long l) { synchronized (this) { super.print(l); write(String.valueOf(l)); } } @Override public void print(Object o) { synchronized (this) { super.print(o); write(String.valueOf(o)); } } @Override public void print(String s) { synchronized (this) { super.print(s); if (s == null) { write("null"); } else { write(s); } } } @Override public void println() { synchronized (this) { newLine(); super.println(); } } @Override public void println(boolean x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(char x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(int x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(long x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(float x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(double x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(char x[]) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(String x) { synchronized (this) { print(x); newLine(); super.println(); } } @Override public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); super.println(); } } } 

I removed the Consumer aspect to be simple, but all that is really needed is here. This is how I used this class:

 System.setOut(new PrintStreamCapturer(logTextArea, System.out)); System.setErr(new PrintStreamCapturer(logTextArea, System.err, "[ERROR] ")); 
+5
source share

I like the answer from MadProgrammer, but I don't think this will work for UTF-8 characters.

Instead, I would make StreamCapturer an extension of ByteArrayOutputStream and use it as a recording implementation.

  @Override public void write(int b){ if ('\n' == (char) b) { consumer.appendText(toString()); reset(); } else { super.write(b); } old.write(b); } 

I skip part of the prefix because I do not need this in my implementation. Thanks for the code, however, it helped a lot!

+3
source share

Just updating the original MadProgrammer code for NOOBS - pass the JTextArea parameter to the constructor, for example.

 new RedirectText(Main.window.textArea1); 
0
source share

All Articles