sirve que progressbar para ejemplo java swingworker

que - ¿Cómo uso SwingWorker en Java?



swingworker progressbar ejemplo (2)

Relacionado con mi pregunta anterior: ¿ Llamar a pintar desde otra clase en Java?

Soy nuevo en Java y he echado un vistazo a algunos tutoriales en SwingWorker. Sin embargo, no estoy seguro de cómo implementarlo con el código de ejemplo que di en la pregunta anterior.

¿Alguien puede explicar cómo usar SwingWorker con respecto a mi fragmento de código y / o señalarme hacia un tutorial decente? Lo he buscado pero todavía no estoy seguro de haberlo entendido.


De acuerdo:

Ejecutar tareas de larga ejecución en el subproceso de envío de evento (EDT) puede hacer que la GUI se bloquee.

No estoy de acuerdo:

así que una de las cosas que se hicieron fue usar SwingUtilities.invokeLater e invokeAndWait que mantienen la GUI en buen estado.

¡invokeLater aún ejecuta el código en el EDT y puede congelar su UI! Prueba esto:

SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } } });

Al menos yo, no puedo mover el mouse una vez que hago clic en el botón que desencadena la acción realizada con el código anterior. ¿Me estoy perdiendo de algo?


En general, SwingWorker se utiliza para realizar tareas de larga ejecución en Swing.

Ejecutar tareas de larga ejecución en el Event Dispatch Thread (EDT) puede hacer que la GUI se bloquee, por lo que una de las cosas que se hicieron fue usar SwingUtilities.invokeLater e invokeAndWait que mantiene la GUI sensible al priorizar otros eventos AWT antes. ejecutando la tarea deseada (en forma de Runnable ).

Sin embargo, el problema con SwingUtilities es que no permitió la devolución de datos desde el Runnable ejecutado al método original. Esto es lo que SwingWorker fue diseñado para abordar.

El tutorial de Java tiene una sección sobre SwingWorker .

Aquí hay un ejemplo donde se usa un SwingWorker para ejecutar una tarea que consume tiempo en un hilo separado, y muestra un cuadro de mensaje un segundo más tarde con la respuesta.

Primero, se hará una clase que extienda SwingWorker :

class AnswerWorker extends SwingWorker<Integer, Integer> { protected Integer doInBackground() throws Exception { // Do a time-consuming task. Thread.sleep(1000); return 42; } protected void done() { try { JOptionPane.showMessageDialog(f, get()); } catch (Exception e) { e.printStackTrace(); } } }

El tipo de devolución de los métodos doInBackground y get se especifica como el primer tipo de SwingWorker , y el segundo tipo es el tipo utilizado para devolver los métodos de publish y process , que no se utilizan en este ejemplo.

Luego, para invocar a SwingWorker , se llama al método de execute . En este ejemplo, engancharemos un ActionListener a un JButton para ejecutar AnswerWorker :

JButton b = new JButton("Answer!"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new AnswerWorker().execute(); } });

El botón de arriba se puede agregar a un JFrame y hacer clic para obtener un cuadro de mensaje un segundo después. Lo siguiente se puede utilizar para inicializar la GUI para una aplicación Swing:

private void makeGUI() { final JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setLayout(new FlowLayout()); // include: "class AnswerWorker" code here. // include: "JButton" b code here. f.getContentPane().add(b); f.getContentPane().add(new JButton("Nothing")); f.pack(); f.setVisible(true); }

Una vez que se ejecuta la aplicación, habrá dos botones. Uno etiquetado como "¡Respuesta!" y otro "Nada". Cuando uno hace clic en "¡Responder!" botón, nada sucederá al principio, pero al hacer clic en el botón "Nada" funcionará y demostrará que la GUI responde.

Y, un segundo después, el resultado del AnswerWorker aparecerá en el cuadro de mensaje.