Swing Worker: function get ()

Mi problema es que no entiendo cómo funciona el swingworker porque lo que trato de hacer es hacer fa=worker.get() porque tengo un método largo que calcula muchos puntos en segundo plano porque no lo hago Quiero congelar mi interfaz y quiero obtener sus resultados para pintar la imagen del componente. Pero no entiendo a dónde va cuando hago fa=worker.get() porque mi consola imprime "titi" y pongo muchas otras impresiones para ver la siguiente parte del progtwig alcanzada pero nadie se imprime. Ayúdame a saber dónde va la comstackción después de get() o mientras se ejecuta y si tienes una idea de cómo implementar lo que necesito, cada bloque de código es bienvenido.

 public void paintComponent(final Graphics g1){ // TODO Auto-generated method stub final int width=getWidth(); final int height=getHeight(); image= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //On transforme le rectangle de base en un rectangle qui a le meme ratio que le cadre contenant l'ancien //(Il yaura dessus la meme fractale mais avec plus de fond noir) afin que l'on puisse zoomer sans deformer la fractale frame = frame.expandToAspectRatio((double)getWidth()/getHeight()); FlameAccumulator fa=null; worker= new SwingWorker(){ @Override protected FlameAccumulator doInBackground() throws Exception { // TODO Auto-generated method stub System.out.println("exception"); return builder.build().compute(frame,width,height,density); } }; try { System.out.println("titi"); fa=worker.get(); } catch (InterruptedException | ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } Graphics g0=(Graphics2D)g1; if(fa==null){ System.out.println("toto"); for (int i = 0; i <height; i++) { for (int j = 0; j < width; j++) { image.setRGB(j,i,0); } } } else{ System.out.println("tata"); for (int i = 0; i <height; i++) { for (int j = 0; j < width; j++) { image.setRGB(j,i,fa.color(palette, background, j, height-1-i).asPackedRGB()); } } } g0.drawImage(image,0,0,null); } 

En lugar de bloquear en get() , debe publish() los resultados intermedios y process() en el EDT, por ejemplo .

Adición: Parece que estás tratando de simular la llama usando un enfoque fractal . Debido a que esto puede ser computacionalmente costoso, puede ser útil construir la imagen como TexturePaint , que se puede usar para rellenar cualquier Shape en un contexto de Graphics . En el ejemplo, SwingWorker publica una secuencia simple de cuadros a una velocidad artificial de ~ 25Hz. Como process() ejecuta en el EDT, es seguro hacer referencia a cada pintura nueva al actualizar el TexturePanel .

imagen

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.TexturePaint; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.util.List; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingWorker; /** * @see https://stackoverflow.com/a/16880714/230513 */ public class HeatTest { private static final int N = 256; private TexturePanel p = new TexturePanel(); private void display() { JFrame f = new JFrame("HeatTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(p); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); new HeatWorker().execute(); } private class TexturePanel extends JPanel { private TexturePaint paint; public void setTexture(TexturePaint tp) { this.paint = tp; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setPaint(paint); g2d.fillRect(0, 0, getWidth(), getHeight()); } @Override public Dimension getPreferredSize() { return new Dimension(N, N); } } private class HeatWorker extends SwingWorker { private final Random random = new Random(); @Override protected TexturePaint doInBackground() throws Exception { BufferedImage image = new BufferedImage(N, N, BufferedImage.TYPE_INT_ARGB); TexturePaint paint = new TexturePaint(image, new Rectangle(N, N)); int[] iArray = {0, 0, 0, 255}; while (true) { WritableRaster raster = image.getRaster(); for (int row = 0; row < N; row++) { for (int col = 0; col < N; col++) { iArray[0] = 255; iArray[1] = (int) (128 + 32 * random.nextGaussian()); iArray[2] = 0; raster.setPixel(col, row, iArray); } } publish(paint); Thread.sleep(40); // ~25 Hz } } @Override protected void process(List list) { for (TexturePaint paint : list) { p.setTexture(paint); p.repaint(); } } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new HeatTest().display(); } }); } } 

No debe llamar a get() en el método paintComponent() . Esto bloqueará y esperará hasta que el trabajador haya terminado su cálculo. get () solo debe invocarse en el método done() de su trabajador, cuando esté seguro de que el trabajador ha terminado de hacer su cálculo, como se muestra en el ejemplo que figura en la documentación .