C贸mo usar hilos en Java Swing

    Programar no es f谩cil y agregar una interfaz de usuario en torno a la funcionalidad realmente puede complicar la vida. Especialmente porque no todos los marcos de interfaz de usuario son seguros para subprocesos (incluido Swing). Entonces, 驴c贸mo manejamos de manera eficiente la interfaz de usuario, ejecutamos el c贸digo de trabajador y comunicamos datos entre los dos, todo mientras mantenemos la interfaz de usuario receptiva?

    Afortunadamente para los usuarios de Swing, hay algunas opciones, las cuales pueden hacer que las GUI de programaci贸n sean mucho m谩s simples. Aqu铆 tienes dos de esas opciones.

    Invocar m谩s tarde

    SwingUtilities.invokeLater() es ideal para actualizar la interfaz de usuario desde otro hilo. Tal vez tenga una tarea de larga duraci贸n y le gustar铆a actualizar una barra de progreso para proporcionar comentarios al usuario. Podr铆as probar algo como esto:

    startButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        progressBar.setValue(0);
        progressBar.setStringPainted(true);
    
        // Runs outside of the Swing UI thread
        new Thread(new Runnable() {
          public void run() {
            for (i = 0; i <= 100; i++) {
    
              // Runs inside of the Swing UI thread
              SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                  progressBar.setValue(i);
                }
              });
    
              try {
                java.lang.Thread.sleep(100);
              }
              catch(Exception e) { }
            }
          }
        }).start();
      }
    });
    

    Con suerte, puede ver en este ejemplo c贸mo podr铆a usar SwingUtilities.invokeLater() para comunicarse entre la interfaz de usuario y los subprocesos de trabajo. Tu puedes pensar en invokeLater como una simple devoluci贸n de llamada a la interfaz de usuario para enviar las actualizaciones que necesite.

    Trabajador de swing

    SwingWorker<T,V> se puede utilizar de forma similar a invokeLater, pero cada uno tiene sus puntos fuertes. Personalmente, prefiero usar SwingWorker para tareas de larga duraci贸n para las que no necesito actualizar la interfaz de usuario (como cargar un documento grande), mientras invokeLater podr铆a usarse m谩s para tareas de larga duraci贸n que necesitan actualizar la interfaz de usuario. SwingWorker se puede utilizar de esta forma con:

    private Document doc;
    
    JButton button = new JButton("Open XML");
    button.addActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
    
       // All code inside SwingWorker runs on a seperate thread
       SwingWorker<Document, Void> worker = new SwingWorker<Document, Void>() {
         @Override
         public Document doInBackground() {
           Document intDoc = loadXML();
           return intDoc;
         }
         @Override
         public void done() {
           try {
             doc = get();
           } catch (InterruptedException ex) {
             ex.printStackTrace();
           } catch (ExecutionException ex) {
             ex.printStackTrace();
           }
         }
       };
    
       // Call the SwingWorker from within the Swing thread
       worker.execute();
     }
    });
    

    Esta clase divide los eventos de los trabajadores en m茅todos que se pueden implementar seg煤n sus necesidades. Para un uso m谩s avanzado, consulte el publish(V... chunks) y process(List<V> chunks) m茅todos.

    Recursos

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *