Ver Mensaje Individual
  #13 (permalink)  
Antiguo 04/01/2012, 00:50
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Hilos con Swing

Hola,

Cita:
Iniciado por pcarvajal Ver Mensaje
... lo mas simple posible ...
Eso está realmente difícil, el tema de los hilos es uno de los mas complicados en cualquier lenguaje, si quieres un ejemplo fácil para resolver el problema de Swing multithreading prueba con el vínculo que te mostré donde solamente utilizan el método invokeAndWait.

JavaDesigns-SwingMultithreading
Código Java:
Ver original
  1. javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
  2.                 public void run() {
  3.                     label.setText("" + getPi());
  4.                 }
  5.             });

Yo prefiero utilizar un método diferente, como por ejemplo:

Código Java:
Ver original
  1. package org;
  2.  
  3. import java.awt.Graphics;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.util.concurrent.ThreadLocalRandom;
  7. import java.util.concurrent.atomic.AtomicBoolean;
  8. import java.util.concurrent.atomic.AtomicInteger;
  9. import javax.swing.JButton;
  10. import javax.swing.JFrame;
  11. import javax.swing.JTextField;
  12.  
  13. public class JApp extends JFrame {
  14.  
  15.     private JTextField jTextField1, jTextField2;
  16.     private Threads Thread1, Thread2;
  17.  
  18.     public JApp() {
  19.         initComponents();
  20.     }
  21.  
  22.     private void initComponents() {
  23.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  24.         getContentPane().setLayout(new java.awt.FlowLayout());
  25.         jTextField1 = new javax.swing.JTextField("1000");
  26.         jTextField2 = new javax.swing.JTextField("1000");
  27.         getContentPane().add(jTextField1);
  28.         getContentPane().add(jTextField2);
  29.  
  30.         JButton button = new JButton("Pausa");
  31.         button.addActionListener(new ActionListener() {
  32.             @Override
  33.             public void actionPerformed(ActionEvent e) {
  34.                 if (Thread1.isPaused()) {
  35.                     Thread1.resume();
  36.                 } else {
  37.                     Thread1.pause();
  38.                 }
  39.             }
  40.         });
  41.         getContentPane().add(button);
  42.  
  43.         pack();
  44.  
  45.         Thread1 = new Threads(this);
  46.         Thread2 = new Threads(this);
  47.         new Thread(Thread1).start();
  48.         new Thread(Thread2).start();
  49.     }
  50.  
  51.     @Override
  52.     public void paint(Graphics g) {
  53.         super.paint(g);
  54.         jTextField1.setText(String.valueOf(Thread1.get()));
  55.         jTextField2.setText(String.valueOf(Thread2.get()));
  56.     }
  57.  
  58.     @Override
  59.     public void dispose() {
  60.         Thread1.stop();
  61.         Thread2.stop();
  62.         super.dispose();
  63.     }
  64.  
  65.     public static void main(String args[]) {
  66.         java.awt.EventQueue.invokeLater(new Runnable() {
  67.             @Override
  68.             public void run() {
  69.                 new JApp().setVisible(true);
  70.             }
  71.         });
  72.     }
  73.  
  74.     private class Threads implements Runnable {
  75.         private AtomicBoolean running = new AtomicBoolean(true);
  76.         private AtomicInteger value = new AtomicInteger(0);
  77.         private AtomicBoolean pause = new AtomicBoolean(false);
  78.         private JFrame frame;
  79.         public Threads(JFrame frame) {
  80.             this.frame = frame;
  81.         }
  82.         @Override
  83.         public void run() {
  84.             try {
  85.                 while (running.get()) {
  86.                     if (pause.get()) {
  87.                         synchronized(this) {
  88.                             wait();
  89.                         }
  90.                     }
  91.                     value.set((int)(ThreadLocalRandom.current().nextInt(1000)));
  92.                     frame.repaint();
  93.                     Thread.sleep(1000);
  94.                 }
  95.             } catch (InterruptedException ex) {
  96.                 System.err.println(ex);
  97.             }
  98.         }
  99.         public void stop() {
  100.             running.set(false);
  101.             if (isPaused()) resume();
  102.         }
  103.         public void pause() {
  104.             pause.set(true);
  105.         }
  106.         public boolean isPaused() {
  107.             return pause.get();
  108.         }
  109.         public void resume() {
  110.             pause.set(false);
  111.             synchronized(this) {
  112.                 notify();
  113.             }
  114.         }
  115.         public Integer get() {
  116.             return value.get();
  117.         }
  118.     }
  119.  
  120. }

Pero es mucho más complicado de entender, cuando realizo una aplicación siempre pienso en que en un momento dado pueda ser que la tenga que mejorar, por ejemplo en esta aplicación no solo podrías mostrar un número sino enviar toda una estructura de datos de un hilo a otro, por supuesto con pequeñas modificaciones.

Saludos,