Una vez que
doInBackground
regresa, el método
done
se llama desde el subproceso de despachamiento de
eventos. Este método trata de asignar al objeto
JLabel
que contiene el resultado del valor de retorno de
doInBack-
ground
, mediante una llamada al método
get
para obtener este valor de retorno (línea 33). El método
get
espera
a que el resultado este listo, en caso de ser necesario, pero como lo llamamos desde el método
done
, el cálculo se
completará antes de que se llame a
get
. En las líneas 35 a 38 se atrapa una excepción
InterruptedException
si
el subproceso actual se interrumpe mientras espera a que
get
regrese. En las líneas 39 a 43 se atrapa una excepción
ExecutionException
, que se lanza si ocurre una excepción durante el cálculo.
La clase
NumerosFibonacci
(fi gura 23.26) muestra una ventana que contiene dos conjuntos de compo-
nentes de GUI: uno para calcular un número de Fibonacci en un subproceso trabajador, y otro para obtener el
siguiente número de Fibonacci en respuesta a la acción del usuario de oprimir un botón
JButton
. El constructor
(líneas 38 a 109) coloca estos componentes en objetos
JPanel
con títulos separados. En las líneas 46 a 47 y 78
a 79 se agregan dos objetos
JLabel
un objeto
JTextField
y un objeto
JButton
al objeto
trabajadorJPanel
para que el usuario pueda introducir un entero, cuyo número de Fibonacci se calculará mediante el objeto
Bac-
kgroundWorker
. En las líneas 84 a 85 y 103 se agregan dos objetos
JLabel
y un objeto
JButton
al panel del
subproceso de despachamiento de eventos, para permitir al usuario obtener el siguiente número de Fibonacci en
la secuencia. Las variables de instancia
n1
y
n2
contienen los dos números de Fibonacci anteriores en la secuencia,
y se inicializan con
0
y
1
respectivamente (líneas 29 y 30). La variable de instancia
cuenta
almacena el número
en la secuencia que se calculó más recientemente, y se inicializa con
1
(línea 31). Al principio, los dos objetos
JLabel
muestran a cuenta y a
n2
, de manera que el usuario pueda ver el texto
Fibonaccide1:1
en el objeto
subprocesoEventosJPanel
cuando la GUI inicia.
1
// Fig. 23.26: NumerosFibonacci.java
2
// Uso de SwingWorker para realizar un cálculo extenso, en donde
3
// los resultados intermedios se muestran en una GUI.
4
import
java.awt.GridLayout;
5
import
java.awt.event.ActionEvent;
6
import
java.awt.event.ActionListener;
7
import
javax.swing.JButton;
8
import
javax.swing.JFrame;
9
import
javax.swing.JPanel;
10
import
javax.swing.JLabel;
11
import
javax.swing.JTextField;
12
import
javax.swing.border.TitledBorder;
13
Import
javax.swing.border.LineBorder;
14
import
java.awt.Color;
15
import
java.util.concurrent.ExecutionException;
16
17
public class
NumerosFibonacci
extends
JFrame
18
{
19
// componentes para calcular el valor de Fibonacci de un número introducido por el
usuario
20
private final
JPanel trabajadorJPanel =
21
new
JPanel(
new
GridLayout(
2
,
2
,
5
,
5
) );
22
private final
JTextField numeroJTextField =
new
JTextField();
23
private final
JButton iniciarJButton =
new
JButton(
"Iniciar"
);
24
private final
JLabel fibonacciJLabel =
new
JLabel();
25
26
// componentes y variables para obtener el siguiente número de Fibonacci
27
private final
JPanel subprocesoEventosJPanel =
28
new
JPanel(
new
GridLayout(
2
,
2
,
5
,
5
) );
29
private int
n1 =
0
;
// se inicializa con el primer número de Fibonacci
30
private int
n2 =
1
;
// se inicializa con el segundo número de Fibonacci
31
private int
cuenta =
1
;
32
private final
JLabel nJLabel =
new
JLabel(
"Fibonacci de 1: "
);
Figura 23.26
| Uso de
SwingWorker
para realizar un cálculo extenso, en donde los resultados intermedios se
muestran en una GUI. (Parte 1 de 3).
23.11 Subprocesamiento múltiple con GUIs
973
23_MAQ_CAP_23_DEITEL.indd973
4/19/081:33:56AM