Learn 2 Java 1

As you can see the Java implementation of Step 1 of 15 Exercises for Learning a new Programming Language was more complicated than the C# implementation. This was largely due to one factor. You can't poll whether someone is typing from the console in Java.

The second problem is that you can't use a KeyEvent handler in the console, which would the second easiest solution to attempt.

Finally a third problem is that by using an event handler you essentially need to use threading so that the loop doesn't interfere with the handler and you are able to interrupt properly.

If there are better solutions I'd be very interested to see them.

package learn2Java1; import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JTextArea; public class Program extends JFrame implements KeyListener { private JTextArea displayArea; private static final long serialVersionUID = 1; public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater( new Runnable( ){ public void run( ) { createAndShowGUI( ); } }); } public Program( String name ) { super( name ); } private static void createAndShowGUI( ) { Program frame = new Program( "Press ESC to exit program." ); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.addComponentsToPane( ); frame.pack( ); frame.setVisible( true ); Thread t = new Thread( new MessageLoop( frame ) ); t.start( ); } private void addComponentsToPane( ) { displayArea = new JTextArea( 0 ); displayArea.setEditable( false ); displayArea.addKeyListener( this ); getContentPane( ).add( displayArea, BorderLayout.CENTER ); } public void keyPressed(KeyEvent ke) { checkKey( ke, "KeyPressed: " ); } public void keyReleased(KeyEvent ke) { checkKey( ke, "KeyReleased: " ); } public void keyTyped(KeyEvent ke) { checkKey( ke, "KeyTyped: " ); } private void checkKey( KeyEvent ke, String message ) { System.out.println( message + ke.getKeyCode() ); if ( ke.getID() != KeyEvent.KEY_TYPED && ke.getKeyCode() == KeyEvent.VK_ESCAPE ) System.exit( 0 ); } public void updateArea( String text ) { displayArea.setText( text ); } private static class MessageLoop implements Runnable { Program messageSpace; public MessageLoop( Program thisFrame ) { messageSpace = thisFrame; } public void run( ) { for ( int i = 0; ; i++ ) { messageSpace.updateArea( i + " " ); try { Thread.sleep( 250 ); } catch ( InterruptedException ie ) { } } } } }

posted by dharh 7:15 PM Feb 10th, 2008



2011: 5 3 1
2010: 12 9 7 1
2009: 12 11 8 5
2008: 12 5 4 3 2 1
2007: 12 11 10 9 8 7 6 5 4 3 2 1
2006: 12 11 10 9 8 7 6 5 4 3 2 1
2005: 12 10 7 6
2004: 10 9 6 5 4 3 2 1