Ti conviene utilizzare Swing e non AWT.
Per la chiusura del Frame puoi utilizzare setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Prima di tutto se vuoi utilizzare un carattere non ha senso memorizzarlo in una stringa. Ha ancora meno senso concatenare il valore letto da tastiera...
Il valore dovresti leggerlo in keyPressed() o keyReleased(). Inoltre non capisco perchè metti l'ascoltatore nel metodo paint()!!
paint() viene chiamato ogni volta che deve essere ridisegnata la finestra...non viene chiamato solo una volta!
Comunque ecco il codice sistemato. E' ciò che ti serve penso:
codice:
import java.awt.*;
import java.awt.event.*;
public class EsercizioDue extends Frame implements KeyListener
{
Ascoltatore asc = new Ascoltatore();
char testo;
public static void main (String args[])
{
EsercizioDue ist = new EsercizioDue();
}
EsercizioDue()
{
setBounds(5,10,500,300);
setTitle ("Esercizio Due");
addWindowListener(asc);
addKeyListener(this);
setVisible(true);
}
public void keyPressed (KeyEvent e)
{
}
public void keyReleased (KeyEvent e)
{
testo = e.getKeyChar();
repaint();
}
public void keyTyped (KeyEvent e)
{
}
public void paint (Graphics g)
{
g.setColor(Color.red);
g.drawString("Digita una R per disegnare un rettangolo oppure uno O per un ovale", 20, 40);
g.setColor(Color.black);
g.drawString(String.valueOf(testo), 30, 80);
if (testo == 'r')
g.drawRect(20, 80, 400, 200);
if (testo == 'o')
g.drawOval(20, 80, 400, 200);
// else
// System.out.println("Hai digitato un tasto non corretto");
}
class Ascoltatore extends WindowAdapter
{
public void windowClosed (WindowEvent e)
{
System.exit(0);
}
public void windowClosing (WindowEvent e)
{
e.getWindow().dispose();
}
}
}