Download Programación en Java2 - Universidad de La Serena
Document related concepts
no text concepts found
Transcript
Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing Capitulo 15. Más.... Swing En la sección GUI(Swing), Events y Layout se dieron los pasos preliminares y otras herramientas un tanto más sofisticadas para entender la filosofía que estaba detrás de las apariencias gráficas. La idea es ahora continuar entregando otras herramientas que ofrece Java2 respecto al diseño de una interfaz de usuario. Todos los elementos de Swing son parte del paquete javax.swing.*;. Barras de Herramientas La clase JToolBar ofrece la posibilidad de usar barras de herramientas movibles y acoplables con Swing. Los objetos de esta clase son contenedores de otros componentes Swing o del AWT. La aplicación que luego se muestra ilustra las posibilidades de barras de herramientas y de información sobre herramientas que tiene Swing. Este programa cuenta con una barra de herramientas en la parte superior de la ventana, por debajo de la barra de menús. Si Ud. coloca el ratón sobre el primer botón aparecerá la información New sobre la herramienta. Además puede verificar que la barra de herramientas es movible, arrástrela para verificarlo. En resumen esta aplicación es creada por un objeto de la clase JToolBar y lo asigna a la variable miToolbar. El array iconFile identifica el nombre de archivo de los iconos de los botones de la barra de herramientas. El array buttonLabels identifica la información sobre herramientas de los botones de la barra de herramientas. El array icons se usa para mantener las imágenes de los botones de la barra de herramientas. El array buttons contiene los botones activos. Finalmente el método layoutComponents() crea los iconos de imagen a partir de sus archivos de imagen correspondientes, crea los botones a partir de sus iconos y establece la información sobre herramientas de cada botón, entre el tercer y cuarto botón se agrega un separador. Los botones se agregan al objeto JToolBar. Aplicación (SwingBarra) import java.awt.*; import java.awt.event.*; import javax.swing.*; 1 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing import javax.swing.event.*; public class SwingBarra extends JFrame { public static int ANCHO = 400; public static int ALTO = 400; public static String TITULO = "SwingBarra"; Container miContainer; // Swing componentes JToolBar miToolBar = new JToolBar(); String[] iconFiles {"new.gif","open.gif","save.gif","cut.gif", "copy.gif","paste.gif"}; String[] buttonLabels {"New","Open","Save","Cut","Copy","Paste"}; ImageIcon[] icons = new ImageIcon[iconFiles.length]; JButton[] buttons = new JButton[buttonLabels.length]; JMenuBar miMenuBar = new JMenuBar(); JMenu miFileMenu = new JMenu("File"); JMenuItem miFileExit = new JMenuItem("Exit"); = = public SwingBarra() { super(TITULO); buildGUI(); setupEventosTrato(); setSize(ANCHO,ALTO); show(); } void buildGUI() { setupMenuBar(); layoutComponentes(); } void setupMenuBar() { miFileMenu.add(miFileExit); miMenuBar.add(miFileMenu); setJMenuBar(miMenuBar); } public void layoutComponentes() { miContainer = getContentPane(); miContainer.setLayout(new BorderLayout()); for(int i=0;i<buttonLabels.length;++i) { icons[i] = new ImageIcon(iconFiles[i]); buttons[i] = new JButton(icons[i]); buttons[i].setToolTipText(buttonLabels[i]); if(i==3) miToolBar.addSeparator(); miToolBar.add(buttons[i]); } miContainer.add("North",miToolBar); } 2 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing void setupEventosTrato() { addWindowListener(new WindowTrato()); miFileExit.addActionListener(new MenuItemTrato()); } public static void main(String[] args) { SwingBarra app = new SwingBarra(); } public class WindowTrato extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public class MenuItemTrato implements ActionListener { public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if(cmd.equals("Exit")) System.exit(0); } } } Etiquetas y Botones Las clases JLabel y JButton proporcionan los equivalentes de Swing a las clases Label y Button del AWT. La implementación de Swing ofrece la ventaja de poder usar iconos a la vez que texto. Componentes de Texto Las clases JTextComponent, JTextField y JTextArea son los equivalentes de Swing de las clases TextComponent, TextField y TextArea de AWT. Listas, Cuadros Combinados y Tablas Las clases JComboBox y JList ofrecen la posibilidad de presentarle al usuario una lista de selecciones gráficas o de texto. La clase JComboBox implementa una lista desplegable, parecida a una lista de opciones Motif. Por otra parte JList es una lista de selecciones individuales o múltiples en las que se pueden ver muchos elementos. Los objetos JList normalmente se agregan a un objeto JScrollPane, de forma que uno se pueda desplazar por la lista. En la siguiente aplicación veremos ejemplos de lo que aquí se ha señalado además de otra herramienta llamada JTable, que es otro componentes de Swing que carece de equivalentes en AWT. JTable ofrece una posibilidad muy flexible para crear y mostrar tablas. Permite construir tablas a partir de arrays o vectores de objetos, o bien a partir de objetos que implementan la interfaz TableModel que es una variante de la que aquí se usa, y que es 3 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing CalendarModel. La aplicación se llama Calendario, e ilustra el uso de las tablas de Swing. La interfaz se ve así: Aquí está el código de Calendario.java, el cual utiliza los array anhos y meses para identificar los años y los meses que admite el calendario. Aplicación (Calendario) import import import import import import java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*; javax.swing.table.*; java.util.Date; public class Calendario extends JFrame { public static int ANCHO = 600; public static int ALTO = 400; public static String TITULO = "Calendario"; Container miContainer; // Swing componentes String[] anhos = {"1998","1999","2000","2001", "2002","2003","2004","2005"}; JComboBox miComboBox = new JComboBox(anhos); String[] meses = {"Enero","Febrero","Marzo","Abril","Mayo", "Junio","Julio","Agosto","Septiembre","Octubre","Noviembre", "Diciembre"}; 4 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing /*el objeto JList se usa para crear un objeto JscrollPane que admite el desplazamiento por la lista*/ JList miList = new JList(meses); JScrollPane miScrollPane = new JScrollPane(miList); /* es una clase interna para implementar el modelo de la tabla, se crea y se le asigna a miModel*/ CalendarModel miModel = new CalendarModel(); /*se crea un objeto Jtable, a partir del objeto CalendarModel y se asigna a la variable miTable*/ JTable miTable = new JTable(miModel); JMenuBar miMenuBar = new JMenuBar(); JMenu miFileMenu = new JMenu("File"); JMenuItem miFileExit = new JMenuItem("Exit"); public Calendario() { super(TITULO); buildGUI(); setupEventosTrato(); setSize(ANCHO,ALTO); show(); } void buildGUI() { setupMenuBar(); layoutComponentes(); } void setupMenuBar() { miFileMenu.add(miFileExit); miMenuBar.add(miFileMenu); setJMenuBar(miMenuBar); } /*este método establece el diseño del contenedor del marco a un diseño null, luego establece los límites, índice seleccionado y manipuladores de eventos*/ public void layoutComponentes() { miContainer = getContentPane(); miContainer.setLayout(null); miComboBox.setBounds(10,10,100,30); miComboBox.setSelectedIndex(0); miComboBox.addItemListener(new ComboTrato()); miScrollPane.setBounds(200,10,150,100); miList.setSelectedIndex(3); miList.addListSelectionListener(new ListaTrato()); miTable.setBounds(10,150,550,200); miModel.setMes(miComboBox.getSelectedIndex()+1998, 5 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing miList.getSelectedIndex()); miContainer.add(miComboBox); miContainer.add(miScrollPane); miTable.setGridColor(Color.black); miTable.setShowGrid(true); miContainer.add(miTable); } void setupEventosTrato() { addWindowListener(new WindowTrato()); miFileExit.addActionListener(new MenuItemTrato()); } public static void main(String[] args) { Calendario app = new Calendario(); } class CalendarModel extends AbstractTableModel { String[] dias = {"Dom","Lun","Mar","Mie","Jue","Vie","Sab"}; int[] numDias = {31,28,31,30,31,30,31,31,30,31,30,31}; String[][] calendario = new String[7][7]; public CalendarModel() { for(int i=0;i<dias.length;++i) calendario[0][i]=dias[i]; for(int i=1;i<7;++i) for(int j=0;j<7;++j) calendario[i][j]=" "; } public int getRowCount() { return 7; } public int getColumnCount() { return 7; } public Object getValueAt(int fila, int columna) { return calendario[fila][columna]; } public void setValueAt(Object valor,int fila, int columna) { calendario[fila][columna] = (String) valor; } public void setMes(int anho,int mes) { for(int i=1;i<7;++i) for(int j=0;j<7;++j) calendario[i][j]=" "; java.util.GregorianCalendar cal = new java.util.GregorianCalendar(); cal.set(anho,mes,1); int offset = cal.get(java.util.GregorianCalendar.DAY_OF_WEEK)-1; offset += 7; int num = diasInMes(anho,mes); 6 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing for(int i=0;i<num;++i) { calendario[offset/7][offset%7]=Integer.toString(i+1); ++offset; } } public boolean bisiesto(int anho) { if(anho % 4 ==0) return true; return false; } public int diasInMes(int anho,int mes) { int dias = numDias[mes]; if(mes==1 && bisiesto(anho)) ++dias; return dias; } } public class WindowTrato extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } //los escuchadores de eventos public class ComboTrato implements ItemListener { public void itemStateChanged(ItemEvent e) { miModel.setMes(miComboBox.getSelectedIndex()+1998, miList.getSelectedIndex()); miTable.repaint(); } } public class ListaTrato implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { miModel.setMes(miComboBox.getSelectedIndex()+1998, miList.getSelectedIndex()); miTable.repaint(); } } public class MenuItemTrato implements ActionListener { public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if(cmd.equals("Exit")) System.exit(0); } } } Deslizadores y Barras de Progreso Los deslizadores y barras de progreso corresponden a las clases JSlider y JProgressBar las que carecen de equivalentes en AWT. Ambas clases admiten orientaciones Horizontales y 7 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing Verticales. La clase JSlider la vimos en capitulos anteriores, de manera que veremos como trabaja JProgressBar que por lo general se usa para mostrar el progreso de una tarea, como por ejemplo la carga de una imagen, o una variante de esto, según lo muestra el archivo BarraProgreso.java. Aplicación (BarraProgreso) import import import import javax.swing.*; javax.swing.border.*; java.awt.*; java.awt.event.*; public class BarraProgreso extends JApplet { Container miContainer = null; JButton startButton, stopButton; JTextField inputTextField, outputTextField; JProgressBar miProgBar = null; Timer miTimer = null; static int sum = 0; static int contar = 0; public void init() { // 1. Tratar el contenido de pane y asignarlo a grid layout. miContainer = this.getContentPane(); miContainer.setLayout(new GridLayout(3,1)); // 2. Agrega una caja horizontal al container. Box hbox1 = Box.createHorizontalBox(); miContainer.add(hbox1); // 3. Agrega labels e ingresa y sale campo de texto a la caja horizontal. hbox1.add(Box.createHorizontalGlue()); JLabel label1 = new JLabel("La Suma de los primeros ", JLabel.LEFT); label1.setFont(new Font("Dialog", Font.PLAIN, 15)); hbox1.add(label1); //lo inicializamos en 100, la entrada inputTextField = new JTextField("100", 4); hbox1.add(inputTextField); JLabel label2 = new JLabel(" numeros es ", JLabel.LEFT); label2.setFont(new Font("Dialog", Font.PLAIN, 15)); hbox1.add(label2); //la salida se visualiza aqui. outputTextField = new JTextField(10); hbox1.add(outputTextField); hbox1.add(Box.createHorizontalGlue()); 8 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing // 4. Agrega otra caja horizontal al container. Box hbox2 = Box.createHorizontalBox(); miContainer.add(hbox2); // 5. Agrega los botones Start y Stop al container. startButton = new JButton("Start"); startButton.addActionListener(new ButtonListener()); hbox2.add(Box.createHorizontalGlue()); hbox2.add(startButton); hbox2.add(Box.createHorizontalGlue()); stopButton = new JButton("Stop"); stopButton.addActionListener(new ButtonListener()); hbox2.add(Box.createHorizontalGlue()); hbox2.add(stopButton); hbox2.add(Box.createHorizontalGlue()); // 6. Crea y agrega una barra de progreso en el resto del area. miProgBar = new JProgressBar(); miProgBar.setStringPainted(true); Border border = BorderFactory.createLineBorder(Color.red, 2); miProgBar.setBorder(border); miProgBar.setBackground(Color.white); miProgBar.setForeground(Color.blue); miProgBar.setMinimum(0); miProgBar.setMaximum(Integer.parseInt(inputTextField.getText()) ); miContainer.add(miProgBar); // 7. Crea un objeto timer. miTimer = new Timer(0, new TimerListener()); } /* 8. Timer listener que computa la suma de los numeros naturales,indicando el progreso de la computacion, desplegando el resultado.*/ class TimerListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (Integer.parseInt(inputTextField.getText())> 0){ contar++; sum = sum+contar; miProgBar.setValue(contar); outputTextField.setText(Integer.toString(sum)); } else { outputTextField.setText("0"); } 9 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing if (contar Integer.parseInt(inputTextField.getText())) miTimer.stop(); } } >= // 9. Button listener que actualmente starts o stops proceso. class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); el if (button.getText() == "Start") { outputTextField.setText(""); if (inputTextField.getText() != " ") { miProgBar.setMaximum(Integer.parseInt( inputTextField.getText())); sum = 0; contar = 0; miTimer.start(); } } else if (button.getText() == "Stop") { miTimer.stop(); outputTextField.setText(""); sum = 0; contar = 0; miProgBar.setValue(0); } } } } Asi se visualiza la interfaz gráfica Otra aplicación que es una GUI basada en Swing nos muestra una serie de herramientas y nos hace recordar otras que ya han sido abordadas en otros capítulos. Me refiero al archivo 10 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing SwingGUI.java. La interfaz se ve así, para analizar el código se los dejo en el directorio gui12, en donde no solamente estará éste sino todas las aplicaciones del capítulo. 11 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing 12 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing JProgressMonitor import import import import javax.swing.*; javax.swing.border.*; java.awt.*; java.awt.event.*; public class TMonitorProgreso extends JApplet { Container miContainer = null; JButton startButton, stopButton; JTextField inputTextField, outputTextField; ProgressMonitor pMonitor = null; Timer miTimer = null; static int sum = 0; static int contar = 0; public void init() { // 1. Extrae desde content pane y lo asigna a grid layout. miContainer = this.getContentPane(); miContainer.setLayout(new GridLayout(2,1)); // 2. Agrega un box horizontal al container. Box hbox1 = Box.createHorizontalBox(); miContainer.add(hbox1); // 3. Agrega labels y entradas y salidas text fields // al box horizontal. hbox1.add(Box.createHorizontalGlue()); JLabel label1 = new JLabel("La suma de los primeros ", JLabel.LEFT); label1.setFont(new Font("Dialog", Font.PLAIN, 15)); hbox1.add(label1); inputTextField = new JTextField("100", 4); hbox1.add(inputTextField); JLabel label2 = new JLabel(" numeros es JLabel.LEFT); label2.setFont(new Font("Dialog", Font.PLAIN, 15)); hbox1.add(label2); ", outputTextField = new JTextField(10); hbox1.add(outputTextField); hbox1.add(Box.createHorizontalGlue()); // 4. Agrega otro box horizontal al container. Box hbox2 = Box.createHorizontalBox(); miContainer.add(hbox2); // 5. Agrega los botones Start y Stop al container. startButton = new JButton("Start"); 13 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing startButton.addActionListener(new ButtonListener()); hbox2.add(Box.createHorizontalGlue()); hbox2.add(startButton); hbox2.add(Box.createHorizontalGlue()); stopButton = new JButton("Stop"); stopButton.addActionListener(new ButtonListener()); hbox2.add(Box.createHorizontalGlue()); hbox2.add(stopButton); hbox2.add(Box.createHorizontalGlue()); // 6. Crea un objeto timer. miTimer = new Timer(0, new TimerListener()); } /* 7. Se define Timer listener que computa la suma de los números naturales indicando el progreso de la computacion, y despliega el resultado.*/ class TimerListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (Integer.parseInt(inputTextField.getText())> 0){ contar++; sum = sum+contar; pMonitor.setProgress(contar); pMonitor.setNote("Estoy incorporando ahora el " + contar); outputTextField.setText(Integer.toString(sum)); } else { outputTextField.setText("0"); } if (contar Integer.parseInt(inputTextField.getText())){ miTimer.stop(); startButton.setEnabled(true); } } } >= // 8. Button listener que starts o stops el proceso. class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); if (button.getText() == "Start") { startButton.setEnabled(false); //9. Crea un monitor de progreso. pMonitor = new ProgressMonitor(miContainer, "Computacion en Progreso...No se impaciente !!", "Nota", 0, 100); pMonitor.setMillisToPopup(5000); 14 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing outputTextField.setText(""); if (inputTextField.getText() != " ") { pMonitor.setMaximum(Integer.parseInt( inputTextField.getText())); sum = 0; contar = 0; miTimer.start(); } } else if (button.getText() == "Stop") { startButton.setEnabled(true); miTimer.stop(); pMonitor.close(); outputTextField.setText(""); sum = 0; contar = 0; } } } } Arboles Una de las clases nuevas más interesantes que ofrece Swing es la clase JTree. Esta clase implementa una estructura en forma de árbol que se puede usar para mostrar datos jerárquicos. La interfaz TreeNode define métodos que tienen que implementar los nodos de un objeto JTree. Los árboles se crean construyendo objetos de la interfaz TreeNode para luego añadirlos todos juntos a través del método add().Cuando todos los objetos TreeNode se hayan juntado, el objeto TreeNode resultante se pasa al constructor JTree. 15 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing La prestación predeterminada de un objetos JTree utiliza un icono de carpeta con el fin de identificar los nodos de árbol que tienen nodos inferiores y un icono de archivo para identificar las ramificaciones del árbol. La aplicación siguiente llamada SwingTree.java ilustra el uso de los árboles en Java. El programa SwingTree usa un objeto TextField para mostrar las selecciones de los académicos, un objeto ScrollPane para admitir el desplazamiento en un árbol, un objeto Jtree para implementar el árbol y un objeto Renderer para controlar la forma en que se presenta el árbol. Los nodos y ramificaciones del árbol se implementan como objetos DefaultMutableTreeNode. Estos objetos se crean con los nombres de los académicos y los grupos organizativos. El método setupTree() conecta a los objetos anteriores con los nodos del árbol. El método layoutComponentes() diseña el contenedor del marco por medio de un objeto BorderLayout. El método setCellRenderer() establece el objeto resultante del árbol en el objeto Renderer al que hace referencia la variable renderer. El método valueChanged de la clase TreeTrato maneja la selección de los elementos del árbol por medio del método getPathComponent(), para obtener la ruta que el usuario haya seleccionado, y el método getPathCount() para identificar la longitud de esta ruta. El último elemento de la ruta se establece como texto del campo de texto. Si el elenmento es un profesor(en otras palabras en el cuarto nivel del árbol), aparecerán las estadísticas aleatorias de los alumnos aprobados y reprobados junto al nombre del académico. 16 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing Applet de Swing Dado que Swing, ofrece componentes GUI que son equivalentes a los componentes AWT, resulta fácil convertir las aplicaciones y applet a Swing. Las aplicaciones se convierten a Swing reemplazando la clase Frame por JFrame y utilizando getContentPane() para acceder al contenedor del marco, de manera que los componentes GUI que se hubieran añadido al Frame se añaden al contenedor del marco. Los applets se convierten en forma similar reemplazando Applet por JApplet. La gran parte de los componentes GUI del AWT pueden convertirse a Swing anteponiendo el nombre de la clase en AWT por ‘J’. La clase JApplet es el equivalente de Swing de la clase Applet. JApplet se parece a JFrame en que admite un panel de contenido separado. A este contenedor se accede a través del método getContentPane(). Si alguna vez desea utilizar menús en un applet, apreciará mucho la clase JApplet, pues ofrece la posibilidad de utilizar una barra de menús a través del método setJMenuBar. La barra de menús es un objeto de la clase JMenuBar. El applet CalendarioApplet, es una simple “conversión” de una aplicación como era Calendario. La conversión se realiza en el sentido que en vez de ampliar JFrame, CalendarioApplet amplía JApplet, la única diferencia significativa que hay entre ambos es el uso de los menús Año y Mes. Estos menús se configuran en los métodos setupMenuBar() y setupEventTrato(). Observe además que se usan clases separadas para manejar los elementos de menú Año y Mes. El método actionPerformed() de la clase AnhoMenuItemTrato determina el año que se hubiera seleccionado y establece el índice correspondiente en el cuadro combinado y de la lista. El método repaint() se invoca para hacer que la tabla vuelva a aparecer. El método actionPerformed() de la clase MesMenuItemTrato es similar al de la clase AnhoMenuItemTrato. Se determina el mes que se haya seleccionado y se establece el índice correspondiente de la lista. El modelo de la tabla se actualiza y se invoca el método repaint(). 17 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing Veamos otro ejemplo del cual tomaremos el archivo Calculator.java (prestado del Libro Core Java Fundamentals) que es una aplicación y lo transformaremos en un applet. Los pasos fundamentales son: Hacer una página HTML con los tag apropiados para invitar el código del applet. Elimine el método main en la aplicación. Usualmente, main contiene codigos que generan un nuevo objeto frame. Con applet esta tarea es realizada automaticamente realizada por el browser, ya que la clase esta especificada en la página HTML. Reemplace la clase Jframe por la clase Applet. Haga esta clase pública, de otra manera el applet no será cargado. Remueva las llamadas setSize si existen; para los applet el tamaño esta definido por el archivo HTML. Remueva las llamadas a addWindowingListener. Un applet no puede ser cerrado, el termina cuando el browser termina o se sale. Si la aplicación llama a setTitle, elimine la llamada a este método. Los applets no pueden tener barra de titulo(Ud. debera hacerlo, de seguro en la página Web, usando <TITLE> de HTML. Reemplace el constructor con una llamada al método init. Cuando el browser crea un objeto de la clase applet, este llama al método init(). Estos cambios son solamente necesarios si Ud. usa el método getParameter para leer los parametros que afectan el layout del applet. Ud. no puede llamar a getParameter desde el constructor. Como un ejemplo de estas transformaciones, procederemos a cambiar la aplicación Calculator a un applet llamado CalculatorApp. Calculator(C. Horstmann), será transformado a Applet /** * @version 1.20 27 Jun 1998 * @author Cay Horstmann */ import java.awt.*; import java.awt.event.*; import javax.swing.*; class CalculatorPanel extends JPanel implements ActionListener { public CalculatorPanel() { setLayout(new BorderLayout()); display = new JTextField("0"); display.setEditable(false); add(display, "North"); JPanel p = new JPanel(); p.setLayout(new GridLayout(4, 4)); String buttons = "789/456*123-0.=+"; for (int i = 0; i < buttons.length(); i++) addButton(p, buttons.substring(i, i + 1)); add(p, "Center"); 18 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing } private void addButton(Container c, String s) { JButton b = new JButton(s); c.add(b); b.addActionListener(this); } public void actionPerformed(ActionEvent evt) { String s = evt.getActionCommand(); if ('0' <= s.charAt(0) && s.charAt(0) <= '9' || s.equals(".")) { if (start) display.setText(s); else display.setText(display.getText() + s); start = false; } else { if (start) { if (s.equals("-")) { display.setText(s); start = false; } else op = s; } else { double x = Double.parseDouble(display.getText()); calculate(x); op = s; start = true; } } } public void calculate(double n) { if (op.equals("+")) arg += n; else if (op.equals("-")) arg -= n; else if (op.equals("*")) arg *= n; else if (op.equals("/")) arg /= n; else if (op.equals("=")) arg = n; display.setText("" + arg); } private private private private JTextField display; double arg = 0; String op = "="; boolean start = true; } /*este es el segmento que sufre las modificaciones*/ class CalculatorFrame extends JFrame { public CalculatorFrame() { setTitle("Calculator"); 19 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing setSize(200, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container contentPane = getContentPane(); contentPane.add(new CalculatorPanel()); } } public class Calculator { public static void main(String[] args) { JFrame frame = new CalculatorFrame(); frame.show(); } } CalculatorApp.java(la conversión de una aplicación a Applet) /* lo anterior se cambia a esto, y listo el applet!!, notar que se ha eliminado la clase con el método main, cambiamos la clase panel a la clase applet, y removimos las llamadas a setTitle, setSize y addWindowListener desde el constructor.*/ public class CalculatorApplet extends JApplet { public void init() { Container contentPane = getContentPane(); contentPane.add(new CalculatorPanel()); } } 20 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing La página HTML se ve así, para ejecutarla con >appletviewer CalculatorApp.html <HTML> <TITLE> Una Calculadora Applet</TITLE> <BODY> <APPLET CODE=”CalculatorApp.class” WIDTH=180 HEIGHT=180> </APPLET> </BODY> </HTML> Que es esto, una Aplicación, un Applet o ambas cosas ? //MiSuperApplet.java import java.applet.Applet; import java.awt.*; import javax.swing.*; public class MiSuperApplet extends JApplet { // codigo applet, incluyendo constructores y métodos // init() y start(). public static void main( String [] args ) { // instancia el applet JApplet miApplet = new MiSuperApplet( ); // crea un window para que corra el applet JFrame miFrame = new JFrame( ); miFrame.setSize(200,200); // posiciona el applet en el window miFrame.getContentPane( ).add("Center", miApplet); // start el applet miApplet.init( ); miApplet.start( ); 21 Area de Computación , Universidad de La Serena Prof. Dr. Eric Jeltsch F. Programación en Java2 Cap 15:Mas.. Swing // display el window miFrame.setVisible(true); } } 22 Area de Computación , Universidad de La Serena