2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 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
35 import java.awt.event.*;
37 public class AWTConsole extends WindowAdapter implements WindowListener,
38 ActionListener, Runnable
42 private TextArea textArea;
44 private Thread reader;
46 private Thread reader2;
50 private final PipedInputStream pin = new PipedInputStream();
52 private final PipedInputStream pin2 = new PipedInputStream();
54 Thread errorThrower; // just for testing (Throws an Exception at this Console
58 // create all components and add them
59 frame = new Frame("Java Console");
60 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
61 Dimension frameSize = new Dimension((int) (screenSize.width / 2),
62 (int) (screenSize.height / 2));
63 int x = (int) (frameSize.width / 2);
64 int y = (int) (frameSize.height / 2);
65 frame.setBounds(x, y, frameSize.width, frameSize.height);
67 textArea = new TextArea();
68 textArea.setEditable(false);
69 Button button = new Button("clear");
71 Panel panel = new Panel();
72 panel.setLayout(new BorderLayout());
73 panel.add(textArea, BorderLayout.CENTER);
74 panel.add(button, BorderLayout.SOUTH);
77 frame.setVisible(true);
79 frame.addWindowListener(this);
80 button.addActionListener(this);
84 PipedOutputStream pout = new PipedOutputStream(this.pin);
85 System.setOut(new PrintStream(pout, true));
86 } catch (java.io.IOException io)
88 textArea.append("Couldn't redirect STDOUT to this console\n"
90 } catch (SecurityException se)
92 textArea.append("Couldn't redirect STDOUT to this console\n"
98 PipedOutputStream pout2 = new PipedOutputStream(this.pin2);
99 System.setErr(new PrintStream(pout2, true));
100 } catch (java.io.IOException io)
102 textArea.append("Couldn't redirect STDERR to this console\n"
104 } catch (SecurityException se)
106 textArea.append("Couldn't redirect STDERR to this console\n"
110 quit = false; // signals the Threads that they should exit
112 // Starting two seperate threads to read from the PipedInputStreams
114 reader = new Thread(this);
115 reader.setDaemon(true);
118 reader2 = new Thread(this);
119 reader2.setDaemon(true);
123 // you may omit this part for your application
125 System.out.println("Hello World 2");
126 System.out.println("All fonts available to Graphic2D:\n");
127 GraphicsEnvironment ge = GraphicsEnvironment
128 .getLocalGraphicsEnvironment();
129 String[] fontNames = ge.getAvailableFontFamilyNames();
130 for (int n = 0; n < fontNames.length; n++)
131 System.out.println(fontNames[n]);
132 // Testing part: simple an error thrown anywhere in this JVM will be printed
134 // We do it with a seperate Thread becasue we don't wan't to break a Thread
135 // used by the Console.
136 System.out.println("\nLets throw an error on this console");
137 errorThrower = new Thread(this);
138 errorThrower.setDaemon(true);
139 errorThrower.start();
142 public synchronized void windowClosed(WindowEvent evt)
145 this.notifyAll(); // stop all threads
150 } catch (Exception e)
157 } catch (Exception e)
163 public synchronized void windowClosing(WindowEvent evt)
165 frame.setVisible(false); // default behaviour of JFrame
169 public synchronized void actionPerformed(ActionEvent evt)
171 textArea.setText("");
174 public synchronized void run()
178 while (Thread.currentThread() == reader)
183 } catch (InterruptedException ie)
186 if (pin.available() != 0)
188 String input = this.readLine(pin);
189 textArea.append(input);
195 while (Thread.currentThread() == reader2)
200 } catch (InterruptedException ie)
203 if (pin2.available() != 0)
205 String input = this.readLine(pin2);
206 textArea.append(input);
211 } catch (Exception e)
213 textArea.append("\nConsole reports an Internal error.");
214 textArea.append("The error is: " + e);
217 // just for testing (Throw a Nullpointer after 1 second)
218 if (Thread.currentThread() == errorThrower)
223 } catch (InterruptedException ie)
226 throw new NullPointerException(MessageManager.getString("exception.application_test_npe"));
231 public synchronized String readLine(PipedInputStream in)
237 int available = in.available();
240 byte b[] = new byte[available];
242 input = input + new String(b, 0, b.length);
243 } while (!input.endsWith("\n") && !input.endsWith("\r\n") && !quit);
247 public static void main(String[] arg)
249 new AWTConsole(); // create console with not reference