La solución mas simple para este problema es utilizar un componente de un Interface de Usuario pre-fabricado (UI) que tenga un comportamiento correcto.
Nota:Esta página glosa sobre muchos detalles. Para aprender realmente a utilizar los componente de UI puedes ver Crear un Interface de Usuario
El AWT suministra los siguientes componentes (la clase que implementa cada componente se lista entre parentesis):
- Botones (java.awt.Button)
- Checkboxes (java.awt.Checkbox)
- Campos de Texto de una linea (java.awt.TextField)
- Areas de Edicion y visualizacion de texto (java.awt.TextArea)
- Etiquetas (java.awt.Label)
- Listas (java.awt.List)
- Listas desplegables (java.awt.Choice)
- Barras de Desplazamiento (java.awt.Scrollbar)
- Areas de Dibujo (java.awt.Canvas)
- Menús (java.awt.Menu, java.awt.MenuItem, java.awt.CheckboxMenuItem)
- Contenedores (java.awt.Panel, java.awt.Window y sus subclases)
Como la clase Applet hereda desde la clase Container de AWT, es muy facil añadir componentes a un applet y utilizar manejadores de distribución para controlar la posición de los componentes en la pantalla. Aqui tiene algunos de los métodos Container que puede utilizar un applet:
- add()
- Añade el componente especificado.
- remove()
- Elimina el componente especificado.
- setLayout()
- Activa el manejador de Distribucion.
Para hacer que el applet Simple utilice un campo de texto no editable con desplazamiento, utilizaremos la clase TextField. Aqui tienes el código fuente revisado. Los cambios se muestran mas abajo://Ya no se necesita importar java.awt.Graphics //porque el applet no implemnta el método paint(). . . . import java.awt.TextField; public class ScrollingSimple extends Applet { //En vez de utilizar un StringBuffer, usa un TextField: TextField field; public void init() { //Crea el campo de texto y lo hace no editable. field = new TextField(); field.setEditable(false); //Activa el manejador de distriución para que el campo de //texto sea lo más ancho posible. setLayout(new java.awt.GridLayout(1,0)); //Añade el campo de texto al applet. add(field); validate(); addItem("initializing... "); } . . . void addItem(String newWord) { //Esto se utiliza para añadir el string al StringBuffer; //ahora se añade al campo de texto TextField. String t = field.getText(); System.out.println(newWord); field.setText(t + newWord); repaint(); } //El método paint() method ya no se necesita, //porque TextField se redibuja a sí mismo automáticamente.El método revisado de init() crea un campo de texto no editable (un ejemplar de TextField). Se activa el manejador de distribución para que haga el campo de texto tan ancho como sea posible (conocerá más al detalle el manejador destribución en Distribuyendo componentes con un Contenedor) y luego se añade el campo de texto al applet.Despues de todo esto, el método init() llama al método validate() (que el applet a heredado de la clase Component). Se debe llamar a validate() cada vez que se añada uno o mas componentes a un applet es una buena práctica que asegura que los componentes se dibujan a si mismos en la pantalla. Si quieres ahondar en las razones de porque trabaja el metodo validate(), lea Detalles de la Arquitectura de Component
Lo que ve abajo es el resultado del Applet modificado.