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