Browse Source

Texture previews in the Material Editor are now processed in a separate thread

Nehon 10 years ago
parent
commit
dd585adf10

+ 23 - 10
jme3-materialeditor/src/com/jme3/gde/materials/multiview/widgets/TexturePanel.java

@@ -18,7 +18,9 @@ import com.jme3.texture.Texture;
 import java.awt.Component;
 import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 import javax.swing.Icon;
+import javax.swing.SwingUtilities;
 import jme3tools.converters.ImageToAwt;
 import org.openide.util.ImageUtilities;
 
@@ -34,6 +36,7 @@ public class TexturePanel extends MaterialPropertyWidget {
     private boolean repeat = false;
     private String textureName = null;
     private DDSPreview ddsPreview;
+    private final ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
 
     /** Creates new form SelectionPanel */
     public TexturePanel(ProjectAssetManager manager) {
@@ -44,17 +47,26 @@ public class TexturePanel extends MaterialPropertyWidget {
 
     private void displayPreview() {
         if (!"".equals(textureName)) {
-            Texture tex = manager.loadTexture(textureName);
-            Icon newicon = null;
-            if (textureName.toLowerCase().endsWith(".dds")) {
-                if (ddsPreview == null) {
-                    ddsPreview = new DDSPreview(manager);
+            exec.execute(new Runnable() {
+
+                public void run() {
+
+                    Texture tex = manager.loadTexture(textureName);
+                    if (textureName.toLowerCase().endsWith(".dds")) {
+                        if (ddsPreview == null) {
+                            ddsPreview = new DDSPreview(manager);
+                        }
+                        ddsPreview.requestPreview(textureName, "", 80, 80, texturePreview, null);
+                    } else {
+                        final Icon newicon = ImageUtilities.image2Icon(resizeImage(ImageToAwt.convert(tex.getImage(), false, true, 0)));
+                        SwingUtilities.invokeLater(new Runnable() {
+                            public void run() {
+                                texturePreview.setIcon(newicon);
+                            }
+                        });
+                    }
                 }
-                ddsPreview.requestPreview(textureName, "", 80, 80, texturePreview, null);
-            } else {
-                newicon = ImageUtilities.image2Icon(resizeImage(ImageToAwt.convert(tex.getImage(), false, true, 0)));
-            }
-            texturePreview.setIcon(newicon);
+            });
         }
     }
 
@@ -302,6 +314,7 @@ public class TexturePanel extends MaterialPropertyWidget {
         if (ddsPreview != null) {
             ddsPreview.cleanUp();
         }
+        exec.shutdownNow();
     }
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private javax.swing.JButton jButton1;