A simple Java console:
1: //
2: // A simple Java Console for your application (Swing version)
3: // Requires Java 1.1.5 or higher
4: //
5: // Disclaimer the use of this source is at your own risk.
6: //
7: // Permission to use and distribute into your own applications
8: //
9: // RJHM van den Bergh , sales@comweb.nl
10:
11: import java.io.*;
12: import java.awt.*;
13: import java.awt.event.*;
14: import javax.swing.*;
15:
16: public class Console extends WindowAdapter implements WindowListener, ActionListener, Runnable
17: {
18: private JFrame frame;
19: private JTextArea textArea;
20: private Thread reader;
21: private Thread reader2;
22: private boolean quit;
23:
24: private final PipedInputStream pin=new PipedInputStream();
25: private final PipedInputStream pin2=new PipedInputStream();
26:
27: Thread errorThrower; // just for testing (Throws an Exception at this Console)
28:
29: public Console()
30: {
31: // create all components and add them
32: frame=new JFrame("Java Console");
33: Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
34: Dimension frameSize=new Dimension((int)(screenSize.width/2),(int)(screenSize.height/2));
35: int x=(int)(frameSize.width/2);
36: int y=(int)(frameSize.height/2);
37: frame.setBounds(x,y,frameSize.width,frameSize.height);
38:
39: textArea=new JTextArea();
40: textArea.setEditable(false);
41: JButton button=new JButton("clear");
42:
43: frame.getContentPane().setLayout(new BorderLayout());
44: frame.getContentPane().add(new JScrollPane(textArea),BorderLayout.CENTER);
45: frame.getContentPane().add(button,BorderLayout.SOUTH);
46: frame.setVisible(true);
47:
48: frame.addWindowListener(this);
49: button.addActionListener(this);
50:
51: try
52: {
53: PipedOutputStream pout=new PipedOutputStream(this.pin);
54: System.setOut(new PrintStream(pout,true));
55: }
56: catch (java.io.IOException io)
57: {
58: textArea.append("Couldn't redirect STDOUT to this console\n"+io.getMessage());
59: }
60: catch (SecurityException se)
61: {
62: textArea.append("Couldn't redirect STDOUT to this console\n"+se.getMessage());
63: }
64:
65: try
66: {
67: PipedOutputStream pout2=new PipedOutputStream(this.pin2);
68: System.setErr(new PrintStream(pout2,true));
69: }
70: catch (java.io.IOException io)
71: {
72: textArea.append("Couldn't redirect STDERR to this console\n"+io.getMessage());
73: }
74: catch (SecurityException se)
75: {
76: textArea.append("Couldn't redirect STDERR to this console\n"+se.getMessage());
77: }
78:
79: quit=false; // signals the Threads that they should exit
80:
81: // Starting two separate threads to read from the PipedInputStreams
82: //
83: reader=new Thread(this);
84: reader.setDaemon(true);
85: reader.start();
86: //
87: reader2=new Thread(this);
88: reader2.setDaemon(true);
89: reader2.start();
90:
91: // testing part
92: // you may omit this part for your application
93: //
94: System.out.println("Hello World 2");
95: System.out.println("All fonts available to Graphic2D:\n");
96: GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
97: String[] fontNames=ge.getAvailableFontFamilyNames();
98: for(int n=0;n<fontNames.length;n++) System.out.println(fontNames[n]);
99: // Testing part: simple an error thrown anywhere in this JVM will be printed on the Console
100: // We do it with a seperate Thread becasue we don't wan't to break a Thread used by the Console.
101:
102: System.out.println("\nLets throw an error on this console");
103: errorThrower=new Thread(this);
104: errorThrower.setDaemon(true);
105: errorThrower.start();
106: }
107:
108: public synchronized void windowClosed(WindowEvent evt)
109: {
110: quit=true;
111: this.notifyAll(); // stop all threads
112: try { reader.join(1000);pin.close(); } catch (Exception e){}
113: try { reader2.join(1000);pin2.close(); } catch (Exception e){}
114: System.exit(0);
115: }
116: public synchronized void windowClosing(WindowEvent evt)
117: {
118: frame.setVisible(false); // default behaviour of JFrame
119: frame.dispose();
120: }
121:
122: public synchronized void actionPerformed(ActionEvent evt)
123: {
124: textArea.setText("");
125: }
126:
127: public synchronized void run()
128: {
129: try
129: {
130: while (Thread.currentThread()==reader)
131: {
132: try { this.wait(100);}catch(InterruptedException ie) {}
133: if (pin.available()!=0)
134: {
135: String input=this.readLine(pin);
136: textArea.append(input);
137: }
138: if (quit) return;
139: }
140:
141: while (Thread.currentThread()==reader2)
142: {
143: try { this.wait(100);}catch(InterruptedException ie) {}
144: if (pin2.available()!=0)
145: {
146: String input=this.readLine(pin2);
147: textArea.append(input);
148: }
149: if (quit) return;
150: }
151: } catch (Exception e)
152: {
153: textArea.append("\nConsole reports an Internal error.");
154: textArea.append("The error is: "+e);
155: }
156:
157: // just for testing (Throw a Nullpointer after 1 second)
158: if (Thread.currentThread()==errorThrower)
159: {
160: try { this.wait(1000); }catch(InterruptedException ie){}
161: throw new NullPointerException("Application test: throwing an NullPointerException It should arrive at the console");
162: }
163:
164: }
165:
166: public synchronized String readLine(PipedInputStream in) throws IOException
167: {
168: String input="";
169: do
170: {
171: int available=in.available();
172: if (available==0) break;
173: byte b[]=new byte[available];
174: in.read(b);
175: input=input+new String(b,0,b.length);
176: }while( !input.endsWith("\n") && !input.endsWith("\r\n") && !qur>it);
177: return input;
178: }
179:
180: public static void main(String[] arg)
181: {
182: new Console(); // create console with not reference
183: }
184:}