Cómo se mencióno en el Paso 7: Cambiar las llamadas a los método add y setLayout, los programas AWT añaden componentes directamente al objeto Applet y seleccionan directamente el controlador de distribución del applet. Por otro lado, los applets Swing, añaden componentens y seleccionan el controlador de distribución sobre el panel de contenidos del JApplet. Por eso, para convertir applets, debemos hacer que el código fuente cambie lo que se describió en esa sewcción.Además, mientras que FlowLayout es el controlador de distribución por defecto para los applets AWT, BorderLayout los es para los applets Swing. Esto tiene dos repercusiones:
- Si queremos usarun FlowLayout, la versión Swing de nuestro programa debe usar setLayout sobre el panel de contenido para especificarlo.
- Si específicamos BorderLayout en nuestro applet AWT, podemos eliminar la sentencia setLayout de la versión Swing.
No debemos dibujar directamente sobre un JApplet (realmente ni sobre cualquier contenedor de alto nivel) porque será cubierto por el panel de contenido del applet. La solución es tener un componente personalizado para hacer el dibujo y añadirlo al panel de contenido. Puedes ver las instrucciones para convertir canvas, en ella encontrarás trucos para elegir una clase de componente personalizado, y cómo mover el código de dibujo al método apropiado.
Antes de convertir un componente personalizado, debemos chequear si se puede utilizar un componente estandard de Swing. Por ejemplo, si nuestro componente personalizado simplemente muestra una imagen, quizás algún texto, podríamos usar una Etiqueta Swing. Si nuestro componente personalizado implementa un botón con una imagen, podemos usar un Botón Swing en su lugar. Si hemos implementado un árbol o una tabla, podremos usar un Tree Swing o una tabla Swing.Si ningún componente Swing tiene la funcionalidad que necesitamos, recomendamos cambiar la superclase de nuestro componente personalizado de Canvas a JPanel. Luego debemos mover el código de dibujo desde paint o update a un método llamaod paintComponent. En la parte superior de este método, deberíamos insertar super.paintComponent(g). Podremos eliminar todo el código relacionado con el doble buffer, ya que Swing lo proporciona de forma automática.
Otras superclases, como Component JComponent también podrían ser factibles. Extender JComponent en lugar de Component/Container nos ofrecerá el doble buffer automáticamente. Extender JPanel en vez de JComponent ofrece dos cosas: dibujo automático del fondo (lo que podemos desactivar usando setOpaque(false)) además de la habilidad de usar bordes para dibujar los laterales de los componentes.
Los programas AWT rellenan un objeto Choice usando el método addItem. Los programas Swing rellenan un JComboBox creando un Vector, un array, o un modelo de datos con los ítems iniciales. Aquí hay un ejemplo:
Código AWT Código Swing String choiceprefix = "Choice item #"; Choice choice = new Choice(); for (int i = 0; i < 10; i++) { choice.addItem(choiceprefix + i); }String choiceprefix = "Choice item #"; final int numItems = 10; Vector vector = new Vector(numItems); for (int i = 0; i < numItems; i++) { vector.addElement(choiceprefix + i); } JComboBox comboBox = new JComboBox(vector);
Se necesita poner una lista en un scroll pane, mientrás que en el AWT se obtenía automáticamente. Cuando se rellena una lista, no se puede hacer de la misma forma que se hacía en el AWT. En su lugar, necesitamos crear un vector, un array o un modelo de datos con los ítems iniciales.
Cuando se convierten áreas de texto AWT, normalmente tendremos que poner el área de texto Swing en un scrol pane y seleccionar el tamaño preferido del scroll pane. Es un poco más difícil imaginarse la relación entre los viejos argumentos de fila y columna y el tamaño preferido en pixels. Esto significa que probablemente dejemos fuera del constructor del área de texto los argumentos de filas y columnas. No debemos olvidarnos de cambiar las llamadas a add para añadir al scroll pane en vez de al área de texto.Si estamos usando un GridBagLayout debemos asegurarnos de que aplicamos las restricciones al scroll pane y no al área de texto (de otro modo obtendremos un pequeño e inutil scroll pane, que realmente parece que funciona).
Los componentes de texto Swing no tienen un método addTextListener. Debemos convertir el TextEventDemo para suar oyentes de document en su lugar. Esto podría ser un ejemplo útil d euna conversión que no sea 1:1.
Si queremos añadir texto con estilos a nuestro programa, podemos convertir a JEditorPane o a JTextPane en su lugar.