// Anunciamos que usaremos la biblioteca de widgets de la AWT
import java.awt.*;
import java.awt.event.*;

public class StdGui extends Frame { // Se especializa la ventana
  Button boton;  // Se crean variables de instancia
  Label etiq;    // para cada widget
  TextArea area;
  TextField texto;
  Checkbox check;
  List lista;
  Canvas canvas;

  Panel panel;   // El contenedor adicional para texto, boton y check

  public StdGui() { // El constructor para la ventana
    setTitle("Gui");
    setLayout(new BorderLayout()); // asigna el layout

    // crea los widgets
    boton= new Button("quit"); 
    etiq= new Label("¡Hello World!", Label.CENTER);
    area= new TextArea(5, 20);
    texto= new TextField(15);
    check= new Checkbox("check");

    lista = new List(3);
    for (int i = 1; i <= 3; i++) {
      lista.addItem("List item " + i);
    }

    canvas= new MiCanvas();

    panel= new Panel(); // El contenedor adicional
    panel.setLayout(new FlowLayout());

    // armamos el panel
    
    panel.add(texto);
    panel.add(boton);
    panel.add(check);

    // armamos la ventana

    add("North", etiq);
    add("West", area);
    add("East", lista);
    add("Center", canvas);
    add("South", panel);

    // Inscripcion para la acción que produce el campo de texto
    texto.addActionListener(new IngresoDeTexto(this));
    boton.addActionListener(new Salir());
  }
  public static void main(String[] args) {
    Frame vent= new StdGui();
    // Mostramos la ventana
    vent.pack();
    vent.show();
  }
}

class IngresoDeTexto implements ActionListener {
  StdGui gui;
  IngresoDeTexto(StdGui gui) {
    this.gui= gui;
  }
  public void actionPerformed(ActionEvent e) {
    gui.lista.add(gui.texto.getText()); // Agrega el ítem a la lista
    gui.texto.setText(""); // Borra el campo de texto 
  }
}

class Salir implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    System.exit(0);
  }
}

// La extension de Canvas
class MiCanvas extends Canvas {
  public void paint(Graphics g) {
    int w = getSize().width;
    int h = getSize().height;
    g.drawLine(10,10, 100,100);
  }

  public Dimension getMinimumSize() {
    return new Dimension(150,130);
  }

  public Dimension getPreferredSize() {
    return getMinimumSize();
  }
}
