Posteado por: albalba | Mayo 27, 2008

Práctica 11

Uff la última práctica de swing… NOS AUTO-DAMOS ÁNIMO Y TAMBIÉN LO MANDAMOS A LOS LECTORES!!! Ya están aquí los exámenes, así que estudiar bastante para estar todos juntos de nuevo el año que viene.

En fin, a lo que íbamos. Al hacer esta práctica nos percatamos de que SWING es un tema muy extenso, por esta razón es imposible aprenderse todos los métodos y clases que existen en este campo, que hace cada uno,… en definitiva, ES IMPOSIBLE APRENDER SWING PERFECTAMENTE!! Entonces, intentaremos enterarnos de todo lo que podamos hasta que ya nuestros cerebros digan: “Hasta aquí he llegao’ chabalita.”.

A continuación lo que entendimos y lo que no en esta sesión.

 

Esta práctica trataba básicamente de la programación orientada eventos. Para entenderlo hay que comprender que los medios que teníamos para comunicarnos con un programa no son ágiles, no son adecuados (el manejador de ventana, la entrada estándar, los argumentos,..), por ello se desarrollaron los eventos.

Volviendo al tema de los hilos. Los eventos salen del hilo raiz, main. El thread main ejecuta el programa. Todos los eventos que se van produciendo entran en una cola de eventos, los cuales salen de uno en uno hacia el hilo bifurcado, llamado Event-Dispaching Thread. El event-dispaching thread se activa en cuanto invocas a cualquiera de los métodos setVisible(), show(), o pack(). El hilo que procesa los eventos (event-dispaching thread) trabaja secuencialmente, mientras que el hilo del programa (main) procesa eventos secuencialmente también, pero son distintos.

Los eventos no hay que utilizarlos para cualquier cosa. JLabel es pasivo y no necesita un escuchador. En cambio, JButton es activo y sobre él puedo producir un evento el cual será procesado por un objeto actionListener. Hay que añadir un actionListener, uan interfaz, con un método actionPerformed. Tengo un objeto de la clase que implementa actionListener para el botón:

b.addActionListener(o);

Para el escuchador o bien:

- creo una clase interna,

- o una clase que lo implemente y mando el objeto.

Cuando sea necesario utilizar actionListener, hay que importar java.awt.event;

Uno de los errores que cometimos mientras programábamos, fue que queríamos importar este paquete entero con esa sentencia. ERROR!!! Recordad que para importar el paquete event entero hay que colocar la sentencia java.awt.event.*;

 

Al principio de la clase programamos una clase en la que se mostrase una ventana con un botón, cada vez se pulsase dicho botón debía aparecer un texto por la salida estándar. Después de habernos peleado con el juego esto fue fácil de hacer. Lo más cómodo para hacer una clase para que aparezca una ventana, es hacer que ésta herede de JFrame. También la hicimos implementar de la clase actionListener, el escuchador para el botón, así se provocar el evento deseado. Como implementamos de actionListener tan sólo hay que escribir un método, el único que tiene, actionPerformed:

 

java.awt.event
Interface ActionListener

All Superinterfaces:

EventListener

All Known Subinterfaces:

Action

All Known Implementing Classes:

AbstractAction, AWTEventMulticaster, BasicDesktopPaneUI.CloseAction, BasicDesktopPaneUI.MaximizeAction, BasicDesktopPaneUI.MinimizeAction, BasicDesktopPaneUI.NavigateAction, BasicDesktopPaneUI.OpenAction, BasicFileChooserUI.ApproveSelectionAction, BasicFileChooserUI.CancelSelectionAction, BasicFileChooserUI.ChangeToParentDirectoryAction, BasicFileChooserUI.GoHomeAction, BasicFileChooserUI.NewFolderAction, BasicFileChooserUI.UpdateAction, BasicInternalFrameTitlePane.CloseAction, BasicInternalFrameTitlePane.IconifyAction, BasicInternalFrameTitlePane.MaximizeAction, BasicInternalFrameTitlePane.MoveAction, BasicInternalFrameTitlePane.RestoreAction, BasicInternalFrameTitlePane.SizeAction, BasicOptionPaneUI.ButtonActionListener, BasicScrollBarUI.ScrollListener, BasicSliderUI.ActionScroller, BasicSliderUI.ScrollListener, BasicSplitPaneUI.KeyboardDownRightHandler, BasicSplitPaneUI.KeyboardEndHandler, BasicSplitPaneUI.KeyboardHomeHandler, BasicSplitPaneUI.KeyboardResizeToggleHandler, BasicSplitPaneUI.KeyboardUpLeftHandler, BasicTreeUI.ComponentHandler, BasicTreeUI.TreeCancelEditingAction, BasicTreeUI.TreeHomeAction, BasicTreeUI.TreeIncrementAction, BasicTreeUI.TreePageAction, BasicTreeUI.TreeToggleAction, BasicTreeUI.TreeTraverseAction, DefaultCellEditor.EditorDelegate, DefaultEditorKit.BeepAction, DefaultEditorKit.CopyAction, DefaultEditorKit.CutAction, DefaultEditorKit.DefaultKeyTypedAction, DefaultEditorKit.InsertBreakAction, DefaultEditorKit.InsertContentAction, DefaultEditorKit.InsertTabAction, DefaultEditorKit.PasteAction, DefaultTreeCellEditor, DropTarget.DropTargetAutoScroller, FormView, HTMLEditorKit.HTMLTextAction, HTMLEditorKit.InsertHTMLTextAction, JComboBox, List.AccessibleAWTList, MetalFileChooserUI.DirectoryComboBoxAction, StyledEditorKit.AlignmentAction, StyledEditorKit.BoldAction, StyledEditorKit.FontFamilyAction, StyledEditorKit.FontSizeAction, StyledEditorKit.ForegroundAction, StyledEditorKit.ItalicAction, StyledEditorKit.StyledTextAction, StyledEditorKit.UnderlineAction, TextAction, ToolTipManager.insideTimerAction, ToolTipManager.outsideTimerAction, ToolTipManager.stillInsideTimerAction



public interface ActionListener
extends EventListener

The listener interface for receiving action events. The class that is interested in processing an action event implements this interface, and the object created with that class is registered with a component, using the component’s addActionListener method. When the action event occurs, that object’s actionPerformed method is invoked.

Since:

1.1

See Also:

ActionEvent, Tutorial: Java 1.1 Event Model



Method Summary

 void

actionPerformed(ActionEvent e)
          Invoked when an action occurs.

 

Method Detail

actionPerformed

void actionPerformed(ActionEvent e)

Invoked when an action occurs.

 

 

En el método actionPerformed() escribimos lo que queremos que ocurra cuando pulsemos el botón, en este caso haremos que por la salida estándar se lea: Cotilleando.

El profesor nos dijo que si ya teníamos hecho esto, metiésemos hilos en el programa para ver lo que aparecía, por esta razón el Simple00GUI también implementa a la interfaz Runnable. En esta ocasión, no nos quedó más remedio que tirar de la práctica anterior.

El resultado final fue el siguiente:

 

 

Y por pantalla se podía apreciar:

 

 

 

 

Después programamos una clase que presentase una ventana con un botón y una etiqueta, y cuando se pulse el botón, cambiar el color de la etiqueta. Así que, cogimos el programa anterior con un copy paste XD y lo modificamos para lograr el objetivo. Para colocarlo pusimos un GridLayout con dos filas y cero columnas, de tal forma que se colocarían el botón y debajo de él la etiqueta. Tuvimos que modificar el actionPerformed(). En él dejamos la sentencia colocada anteriormente, y añadimos un setBackground, para poner un color de fondo a la etiqueta, y un setOpaque a true. Pero no está muy bien hecho, ya que tan solo cambia de color cuando se pulsa el botón la primera vez, las siguientes veces ya no cambia. No sabemos que hacer para que se nos cambie de color la etiqueta cada vez que se pulse el botón.

Así nos quedó:

 

 

El último programa al que llegamos en esta sesión, fue en el que había que programar una clase que presente lo que se pedía en el ejercicio anterior, pero además, también se cambie de color la etiqueta cada vez que se pulse enter. Esta ya si que no llegamos ni si quiera a que nos compilase. El profe, al ver nuestro código cuando le hicimos una pregunta (bueno, en realidad unas cuantas jeje) nos aconsejó que el constructor tan solo inicializásemos los atributos y la parrafada la colocásemos en otro lado, verdad como un templo, por lo que para hacer esta clase lo pusimos como él nos aconsejó.

Para solucionar ésto, volvimos a pensar en los dichosos hilos. Debíamos hacer que se ejecutasen en distintas partes la interfaz gráfica y el teclado. Para hacer lo del enter, a última hora de clase se nos desveló el secreto, se hacía con un BufferedReader, como toda la vida. Cuando se haya ejecutado el readLine(), cuando se haya pulsado el enter, en el label se cambiará el color. Esto cambio de color queremos que lo haga el event-dispaching thread, principalmente con el método run(). El hilo main ha estado inactivo hasta ahora. Así, el main lanza los eventos gráficos a la cola de eventos y se procesará donde debe, el event-dispaching thread  procesa los eventos gráficos.

Este ejercicio nos resultó bastante “complicaillo”, veremos si ahora que ya tenemos esa “luz”, somos capaces de solucionarlo.

YA TAN SOLO QUEDA UNA PRÁCTICA, YUJUUU!!! Digo, uy que penaa!!

Hasta la siguiente y última compañeros.

 

 

 

 


Respuestas

  1. Hola soy Jose de joseymarco, tomo nota de tu consejo, pero la verdad ha sido un poco lio, la semana pasada nos dicen a nosotros que deberíamos haber comentado el juego ????, cuando habian dicho esto, bueno seguro que depende del profesor a quien preguntas te dice una cosa, sobre vuestra práctica 11, me quedo con la primera parte en la que explicais todo los relacionado con hilos, yo intentaría omitir ese chorro de código que poneis a continuación, de todas formas ya no queda mucho tiempo, asi uqe mucha suerte.


Dejar una respuesta

Su respuesta:

Categorías