Sonntag, 23. Oktober 2011

Eclipse RCP - Bilder laden und verwalten für Fortgeschrittene

Bilder werden mit Eclipse (bzw. SWT) unabhängig vom Dateityp in Image Objekte geladen. Bilder die an vielen Stellen und häufig in einer RCP Applikaiton verwendet werden, sollten mit der ImageRegistry verwaltet werden. Dieser Artikel zeigt dies in einem einfachen Beispiel wie Bilder in und aus der ImageRegistry geladen werden.
Weiterhin werden drei Möglichkeiten wie ein Pfad zu einem Bild angegeben werden kann vorgestellt.

Schritt 1: erstelle eine RCP Eclipse Anwendung die auf dem Template "RCP Application with a view" basiert

Schritt 2: kopiere das Bild "alt_window_32.gif" in das Package in dem sich die View Klasse befindet. Das Projektverzeichnis sollte wie in Abbildung 1 dargestellt aussehen.

Abbildung 1
Schritt 3: in der Klasse View müssen alle inneren Klassen und Attribute gelöscht werden. Der Inhalt der Methoden createPartControl und setFocus sollte ebenfalls gelöscht werden. Der Inhalt der Methode createPartControl wird mit dem Inhalt wie im Programmauszug 1 ersetzt.


import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {
  public static final String ID = 
               "com.blogspot.javadingsda.testimageregistry.view";

  public void createPartControl(Composite parent) {
    GridLayout layout = new GridLayout();
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    parent.setLayout(layout);

    ImageRegistry reg = Activator.getDefault().getImageRegistry();

    Label label = new Label(parent, SWT.NONE);
    GridData gridData = new GridData();
    label.setData(gridData);
    label.setImage(reg.get("testpic"));

    label = new Label(parent, SWT.NONE);
    gridData = new GridData();
    label.setData(gridData);
    label.setImage(reg.get("testpic2"));

    label = new Label(parent, SWT.NONE);
    gridData = new GridData();
    label.setData(gridData);
    label.setImage(reg.get("testpic3"));
  }

  public void setFocus() {}
}
Programmauszug 1

Schritt 4: das Laden der Bilder in die ImagerRegistry kann an beliebiger Stelle erfolgen. Es sollte nur vor der ersten Verwendung erfolgen. Wir entscheiden und dies in der Perspective Klasse zu tun. Programmauszug 2 zeigt die modifizierte Klasse.
Bei Lösung 1 und Lösung 2 wird das Bild aus dem icons Verzeichnis geladen. Lösung 3 läd das Bild aus dem Package in dem sich die View.class befindet.

import java.net.URL;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
import org.osgi.framework.Bundle;

public class Perspective implements IPerspectiveFactory {

  public void createInitialLayout(IPageLayout layout) {
    layout.setEditorAreaVisible(false);
    layout.setFixed(true);

    ImageRegistry regystry = 
                     Activator.getDefault().getImageRegistry();
    String pathStr = "icons/alt_window_32.gif";
    Path path = new Path(pathStr);

    // Lösung 1
    Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
    URL url = FileLocator.find(bundle, path, null);
    ImageDescriptor imageDescriptor = 
                    ImageDescriptor.createFromURL(url);
    regystry.put("testpic", imageDescriptor);
    // Lösung 2
    ImageDescriptor imageDescriptor2 = 
                    Activator.getImageDescriptor(pathStr);
    regystry.put("testpic2", imageDescriptor2);
    // Lösung 3
    ImageDescriptor imageDescriptor3 = 
       ImageDescriptor.createFromFile(View.class, "alt_window_32.gif");
    regystry.put("testpic3", imageDescriptor3);
  }
}
Programmauszug 2


Die gezeigten Beispiele bauen auf folgenden Quellen:


//http://www.javalobby.org/forums/thread.jspa?threadID=16557
//http://www.eclipse.org/articles/Article-RCP-2/tutorial2.html
//http://www.eclipse.org/articles/Article-Using%20Images%20In%20Eclipse/Using%20Images%20In%20Eclipse.html
//http://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html

Keine Kommentare:

Kommentar veröffentlichen