|
![]() |
AWT - Componentes (II) |
Anterior | Siguiente |
Para la entrada directa de datos se suelen utilizar los campos de texto, que aparecen en pantalla como pequeñas cajas que permiten al usuario la entrada por teclado de una línea de caracteres. Los campos de texto (TextField) son los encargados de realizar esta entrada, aunque también se pueden utilizar, activando su indicador de no-editable, para presentar texto e una sola línea con una apariencia en pantalla más llamativa, debido al borde simulando 3-D que acompaña a este tipo de elementos del interfaz gráfico. La clase TextField extiende a la clase TextComponent, que extiende a su vez, a la clase Component. Por ello, hay una gran cantidad de métodos que están accesibles desde los campos de tesxto. La clase TextComponent también es importante en las áreas de texto, en donde se permite la entrada de múltiples líneas de texto. La clase TextComponent es un Componente que permite la edición de texto. Tiene un campo y no dispone de constructores públicos, por lo que no es posible instanciar objetos de esta clase. Sin embargo, sí dispone de un amplio repertorio de métodos que son heredados por sus subclases, que permiten la manipulación del texto. Entre esos métodos hay algunos muy interesantes, como son los que permiten la selección o recuperación del texto marcado, desde programa; la indicación de editabilidad de texto; la recuperación de los eventos producidos por ese Componente, etc. En el programa, java1305.java, que se implementa para ilustrar el uso de los campos de texto, se coloca un objeto TextField sobre un objeto Frame, inicializándolo con la cadena "Texto inicial", que aparecerá en el campo de texto al arrancar el programa, tal como aparece reproducido en la imagen. Sobre el objeto TextField es instanciado y registrado un objeto ActionListener. Cuando se produce un evento porque el usuario haya pulsado la tecla Retorno mientras el objeto TextField, éste es recibido por el receptor de eventos, que en este ejemplo concreto, extrae y presenta en pantalla, en el TextField, el texto en dos formas: presentando todo el texto y también, presentando solamente el trozo de texto que esté seleccionado. Cuando se pulsa la tecla Retorno mientras el campo de texto tiene el foco, el evento es capturado por el método sobrescrito actionPerformed() del objeto ActionListener. El código de este método utiliza el método getSelectedItem() de la clase TextField para acceder y presentar el texto que haya seleccionado el usuario. El código de este método también invoca al método getText() de la clase TextComponent, para presentar el contenido completo del campo de texto. import java.awt.*; import java.awt.event.*; public class java1305 { public static void main( String args[] ) { IHM ihm = new IHM(); } } class IHM { public IHM() { // Instancia un objeto TextField y coloca una cadena como // Texto para que aparezca en el momento de su creación TextField miCampoTexto = new TextField( "Texto inicial" ); // Instancia y registra un receptor de eventos de tipo Action // sobre el campo de texto miCampoTexto.addActionListener(new MiActionListener( miCampoTexto ) ); // Coloca la eqtiqueta sobre el objeto Frame Frame miFrame = new Frame( "Tutorial de Java, AWT" ); miFrame.setLayout( new FlowLayout() ); miFrame.add( miCampoTexto ); miFrame.setSize( 250,150 ); miFrame.setVisible( true ); // Instancia y registra un objeto receptor de eventos de ventana // para concluir la ejecucion del programa cuando el Frame se // cierres por accion del usuario sobre el miFrame.addWindowListener( new Conclusion() ); } } // Clase para recibir los eventos de tipo Action que se produzcan // sobre el objeto TextField sobre el cual se encuentra registrado class MiActionListener implements ActionListener { TextField oCampoTexto; MiActionListener( TextField iCampoTexto ) { // Guarda una referencia al objeto TextField oCampoTexto = iCampoTexto; } // Se sobrescribe el método actionPerformed() del interfaz // ActionListener para que indique en la consola el texto que // se introduce public void actionPerformed( ActionEvent evt ) { System.out.println( "Texto seleccionado: " + oCampoTexto.getSelectedText() ); System.out.println( "Texto completo: " + oCampoTexto.getText() ); } } class Conclusion extends WindowAdapter { public void windowClosing( WindowEvent evt ) { // Concluye el programa cuando se cierra la ventana System.exit( 0 ); } } Las sentencias que se vuelven a reproducir a continuación, instancias un objeto TextField, inicializándolo con una cadena y luego, un objeto ActionListener es instanciado y registrado sobre el objeto TextField. // Instancia un objeto TextField y coloca una cadena como // Texto para que aparezca en el momento de su creación TextField miCampoTexto = new TextField( "Texto inicial" ); // Instancia y registra un receptor de eventos de tipo Action // sobre el campo de texto miCampoTexto.addActionListener(new MiActionListener( miCampoTexto ) ); Hay más sentencias de código que son semejantes a las ya vistas en ejemplos anteriores, así que solamente es necesario recabar atención sobre el método actionPerformed(), en donde se invocan los métodos getSelectedText() y getText() para recuperar y presentar el texto. public void actionPerformed( ActionEvent evt ) { System.out.println( "Texto seleccionado: " + oCampoTexto.getSelectedText() ); System.out.println( "Texto completo: " + oCampoTexto.getText() ); } } Un área de texto (TextArea) es una zona multilínea que permite la presentación de texto, que puede ser editable o de sólo lectura. Al igual que la clase TextField, esta clase extiende la clase TextComponent y dispone de cuatro campos, que son constantes simbólicas que pueden ser utilizadas para especificar la información de colocación de las barras de desplazamiento en algunos de los constructores de objetos TextArea. Estas constantes simbólicas son:
Esta clase TextArea contiene muchos métodos y, además, hay que tener en cuenta que hereda métodos definidos en las clases TextComponent, Component y Object, por lo que no queda más remedio que recurrir a la documentación del API que proporciona Sun para tener cumplida referencia de cada uno de ellos. En el ejemplo, java1306.java, coloca un objeto TextArea sobre un objeto Frame. Esta área de texto dispone de una barra de desplazamiento vertical y se instancia inicialmente con una cadena de diez líneas. La imagen siguiente reproduce la apariencia inicial de la ventana generada en el arranque del programa. Sobre el objeto TextArea se instancia y registra un objeto TextListener, que recogerá eventos de tipo TextEvent, que se produce siempre que haya un cambio en el valor que contiene en área de texto. Este tipo de eventos se capturan en el método sobrescrito textValueChanged() del objeto TextListener, que utiliza el método getText() de la clase TextComponent para acceder y presentar en pantalla todo el texto del objeto TextArea. En este programa, el procesado del texto se realiza a muy bajo nivel, generándose un evento cada vez que cambie un solo carácter. import java.awt.*; import java.awt.event.*; public class java1306 { public static void main( String args[] ) { IHM ihm = new IHM(); } } class IHM { public IHM() { // Instancia un objeto TextArea, con una barra de desplazamiento // vertical y lo inicializa con diez líneas de texto TextArea miAreaTexto = new TextArea( "",5,20, TextArea.SCROLLBARS_VERTICAL_ONLY ); for( int i=0; i < 10; i++ ) miAreaTexto.append( "linea "+i+"\n" ); // Instancia y registra un receptor de eventos de tipo Text // sobre el área de texto miAreaTexto.addTextListener(new MiTextListener( miAreaTexto ) ); // Coloca el área de texto sobre el objeto Frame Frame miFrame = new Frame( "Tutorial de Java, AWT" ); miFrame.setLayout( new FlowLayout() ); miFrame.add( miAreaTexto ); miFrame.setSize( 250,150 ); miFrame.setVisible( true ); // Instancia y registra un objeto receptor de eventos de ventana // para concluir la ejecucion del programa cuando el Frame se // cierres por accion del usuario sobre el miFrame.addWindowListener( new Conclusion() ); } } // Clase para recibir los eventos de tipo Text que se produzcan // sobre el objeto TextArea sobre el cual se encuentra registrado class MiTextListener implements TextListener { TextArea oAreaTexto; MiTextListener( TextArea iAreaTexto ) { // Guarda una referencia al objeto TextArea oAreaTexto = iAreaTexto; } // Se sobrescribe el método textValueChanged() del interfaz // TextListener para que indique en la consola el texto que // ocupa el área de texto cuando se cambie public void textValueChanged( TextEvent evt ) { System.out.println( oAreaTexto.getText() ); } } class Conclusion extends WindowAdapter { public void windowClosing( WindowEvent evt ) { // Concluye el programa cuando se cierra la ventana System.exit( 0 ); } } En el ejemplo anterior hay mucho código que ya se ha visto, y algunas líneas nuevas que se comentan a continuación. En primer lugar se encuentra el código que instancia el objeto de la clase TextArea con una barra de desplazamiento vertical y diez líneas de texto en ese objeto. Para añadir el texto al área, se utiliza el método append() de la clase TextArea, aunque hay varios métodos que también podrían haberse usado. TextArea miAreaTexto = new TextArea( "",5,20, TextArea.SCROLLBARS_VERTICAL_ONLY ); for( int i=0; i < 10; i++ ) miAreaTexto.append( "linea "+i+"\n" ); La línea siguiente instancia y registra un objeto TextListener sobre el objeto TextArea. miAreaTexto.addTextListener(new MiTextListener( miAreaTexto ) ); El fragmento de código que se reproduce a continuación corresponde al método textValueChanged(), que utiliza el método getText() de la clase TextComponent para acceder y presentar todo el texto en el objeto TextArea siempre que haya un cambio en el valor del texto del objeto. public void textValueChanged( TextEvent evt ) { System.out.println( oAreaTexto.getText() ); } |
|