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