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((int) (screenSize.width / 2),
76 (int) (screenSize.height / 2));
77 int x = (int) (frameSize.width / 2);
78 int y = (int) (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++)
145 System.out.println(fontNames[n]);
146 // Testing part: simple an error thrown anywhere in this JVM will be printed
148 // We do it with a seperate Thread becasue we don't wan't to break a Thread
149 // used by the Console.
150 System.out.println("\nLets throw an error on this console");
151 errorThrower = new Thread(this);
152 errorThrower.setDaemon(true);
153 errorThrower.start();
156 public synchronized void windowClosed(WindowEvent evt)
159 this.notifyAll(); // stop all threads
164 } catch (Exception e)
171 } catch (Exception e)
177 public synchronized void windowClosing(WindowEvent evt)
179 frame.setVisible(false); // default behaviour of JFrame
183 public synchronized void actionPerformed(ActionEvent evt)
185 textArea.setText("");
188 public synchronized void run()
192 while (Thread.currentThread() == reader)
197 } catch (InterruptedException ie)
200 if (pin.available() != 0)
202 String input = this.readLine(pin);
203 textArea.append(input);
209 while (Thread.currentThread() == reader2)
214 } catch (InterruptedException ie)
217 if (pin2.available() != 0)
219 String input = this.readLine(pin2);
220 textArea.append(input);
225 } catch (Exception e)
227 textArea.append("\nConsole reports an Internal error.");
228 textArea.append("The error is: " + e);
231 // just for testing (Throw a Nullpointer after 1 second)
232 if (Thread.currentThread() == errorThrower)
237 } catch (InterruptedException ie)
240 throw new NullPointerException(
241 MessageManager.getString("exception.application_test_npe"));
246 public synchronized String readLine(PipedInputStream in)
252 int available = in.available();
255 byte b[] = new byte[available];
257 input = input + new String(b, 0, b.length);
258 } while (!input.endsWith("\n") && !input.endsWith("\r\n") && !quit);
262 public static void main(String[] arg)
264 new AWTConsole(); // create console with not reference