2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
24 // A simple Java Console for your application (Swing version)
25 // Requires Java 1.1.5 or higher
27 // Disclaimer the use of this source is at your own risk.
29 // Permision to use and distribute into your own applications
31 // RJHM van den Bergh , rvdb@comweb.nl
33 import java.awt.BorderLayout;
34 import java.awt.Button;
35 import java.awt.Dimension;
36 import java.awt.Frame;
37 import java.awt.GraphicsEnvironment;
38 import java.awt.Panel;
39 import java.awt.TextArea;
40 import java.awt.Toolkit;
41 import java.awt.event.ActionEvent;
42 import java.awt.event.ActionListener;
43 import java.awt.event.WindowAdapter;
44 import java.awt.event.WindowEvent;
45 import java.awt.event.WindowListener;
46 import java.io.IOException;
47 import java.io.PipedInputStream;
48 import java.io.PipedOutputStream;
49 import java.io.PrintStream;
51 public class AWTConsole extends WindowAdapter
52 implements WindowListener, ActionListener, Runnable
56 private TextArea textArea;
58 private Thread reader;
60 private Thread reader2;
64 private final PipedInputStream pin = new PipedInputStream();
66 private final PipedInputStream pin2 = new PipedInputStream();
68 Thread errorThrower; // just for testing (Throws an Exception at this Console
72 // create all components and add them
73 frame = new Frame("Java Console");
74 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
75 Dimension frameSize = new Dimension(screenSize.width / 2,
76 screenSize.height / 2);
77 int x = frameSize.width / 2;
78 int y = frameSize.height / 2;
79 frame.setBounds(x, y, frameSize.width, frameSize.height);
81 textArea = new TextArea();
82 textArea.setEditable(false);
83 Button button = new Button("clear");
85 Panel panel = new Panel();
86 panel.setLayout(new BorderLayout());
87 panel.add(textArea, BorderLayout.CENTER);
88 panel.add(button, BorderLayout.SOUTH);
91 frame.setVisible(true);
93 frame.addWindowListener(this);
94 button.addActionListener(this);
98 PipedOutputStream pout = new PipedOutputStream(this.pin);
99 System.setOut(new PrintStream(pout, true));
100 } catch (java.io.IOException io)
102 textArea.append("Couldn't redirect STDOUT to this console\n"
104 } catch (SecurityException se)
106 textArea.append("Couldn't redirect STDOUT to this console\n"
112 PipedOutputStream pout2 = new PipedOutputStream(this.pin2);
113 System.setErr(new PrintStream(pout2, true));
114 } catch (java.io.IOException io)
116 textArea.append("Couldn't redirect STDERR to this console\n"
118 } catch (SecurityException se)
120 textArea.append("Couldn't redirect STDERR to this console\n"
124 quit = false; // signals the Threads that they should exit
126 // Starting two seperate threads to read from the PipedInputStreams
128 reader = new Thread(this);
129 reader.setDaemon(true);
132 reader2 = new Thread(this);
133 reader2.setDaemon(true);
137 // you may omit this part for your application
139 System.out.println("Hello World 2");
140 System.out.println("All fonts available to Graphic2D:\n");
141 GraphicsEnvironment ge = GraphicsEnvironment
142 .getLocalGraphicsEnvironment();
143 String[] fontNames = ge.getAvailableFontFamilyNames();
144 for (int n = 0; n < fontNames.length; n++)
146 System.out.println(fontNames[n]);
148 // Testing part: simple an error thrown anywhere in this JVM will be printed
150 // We do it with a seperate Thread becasue we don't wan't to break a Thread
151 // used by the Console.
152 System.out.println("\nLets throw an error on this console");
153 errorThrower = new Thread(this);
154 errorThrower.setDaemon(true);
155 errorThrower.start();
159 public synchronized void windowClosed(WindowEvent evt)
162 this.notifyAll(); // stop all threads
167 } catch (Exception e)
174 } catch (Exception e)
181 public synchronized void windowClosing(WindowEvent evt)
183 frame.setVisible(false); // default behaviour of JFrame
188 public synchronized void actionPerformed(ActionEvent evt)
190 textArea.setText("");
194 public synchronized void run()
198 while (Thread.currentThread() == reader)
203 } catch (InterruptedException ie)
206 if (pin.available() != 0)
208 String input = this.readLine(pin);
209 textArea.append(input);
217 while (Thread.currentThread() == reader2)
222 } catch (InterruptedException ie)
225 if (pin2.available() != 0)
227 String input = this.readLine(pin2);
228 textArea.append(input);
235 } catch (Exception e)
237 textArea.append("\nConsole reports an Internal error.");
238 textArea.append("The error is: " + e);
241 // just for testing (Throw a Nullpointer after 1 second)
242 if (Thread.currentThread() == errorThrower)
247 } catch (InterruptedException ie)
250 throw new NullPointerException(
251 MessageManager.getString("exception.application_test_npe"));
256 public synchronized String readLine(PipedInputStream in)
262 int available = in.available();
267 byte b[] = new byte[available];
269 input = input + new String(b, 0, b.length);
270 } while (!input.endsWith("\n") && !input.endsWith("\r\n") && !quit);
279 public static void main(String[] arg)
281 new AWTConsole(); // create console with not reference