SWT Animated GIF

Status
Nicht offen für weitere Antworten.

ModellbahnerTT

Bekanntes Mitglied
Hallo zusammen,

ich versuche eine Animated GIF auf einer WizardPage darzustellen. Leider wird immer nur das erste und zweite Frame angezeigt. Vielleicht weiß jemand Rat?

Java:
package test;

import org.eclipse.jface.wizard.WizardPage;

public class TestWizardPage2 extends WizardPage {

	private ImageLoader loader;
	private Canvas canvas;
	private Image image;
	private int imageNumber;
	private GC gc;
	private Thread thread;
	
	public TestWizardPage2() {
		super("wizardPage");
		setTitle("Title");
		setDescription("Description");
	}

	public void createControl(Composite parent) {
		final Composite container = new Composite(parent, SWT.NULL);

		setControl(container);
		{
			canvas = new Canvas(container, SWT.NONE);
			canvas.setBounds(32, 34, 64, 64);
		}
		{
			loader = new ImageLoader();
			loader.load("images/loader.gif");
			image = new Image(container.getDisplay(), loader.data[0]);
			gc = new GC(image);
			canvas.addPaintListener(new PaintListener() {
				public void paintControl(PaintEvent event) {
					event.gc.drawImage(image, 0, 0);
					
				}
			});

			thread = new Thread() {
				public void run() {
					long currentTime = System.currentTimeMillis();
					int delayTime = loader.data[imageNumber].delayTime;
					while (currentTime + delayTime * 10 > System
							.currentTimeMillis()) {
						// Wait till the delay time has passed
					}
					container.getDisplay().asyncExec(new Runnable() {
						public void run() {
							// Increase the variable holding the frame number
							imageNumber = imageNumber == loader.data.length - 1 ? 0
									: imageNumber + 1;
							// Draw the new data onto the image
							ImageData nextFrameData = loader.data[imageNumber];
							Image frameImage = new Image(container.getDisplay(), nextFrameData);
							gc.drawImage(frameImage, nextFrameData.x,
									nextFrameData.y);
							frameImage.dispose();
							canvas.redraw();
						}
					});
				}
			};

		}
		thread.start();
	}
}

Vielen Dank im Voraus!
 

dayaftereh

Top Contributor
Hey, nutzt du Swing, weil dan kannst du einfach ein JLabel nehmen und eine ImagIcon als icon nehmen! Lädest du auch alle Frames aus dem Animated Gif? wenn nicht schau mal hier: gif mit mehreren ebenen
 
Zuletzt bearbeitet:

ModellbahnerTT

Bekanntes Mitglied
Yupp, genau da habe ich auch meinen Code her :)
Funktionierte aber leider trotzdem nicht.
Nach einiger Suche bin ich auf die Lösung gekommen.
Ich muss vor dem Runnable noch auf isDisposed prüfen, sonst gibt's eine Exception:

Java:
while (true) {
   if (!label.isDisposed()) {
	// -> Exception in thread "Thread-0"
	// org.eclipse.swt.SWTException: Invalid thread access
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben