Icons von Dateien im TreeView anzeigen

Konstabler

Grünschnabel
Hallo,
ich habe folgendes Problem, und zwar habe ich einen Explorer auf Grundlage des TreeViewer mit SWT implementiert und bekomme es nicht hin die Icons der Dateien mit anzuzeigen. Im AWT kam ich immer an die Icons über FileSystemView, aber Icon-Objecte möchte der LabelProvider des TreeViewers nicht. Dieser benötigt eine Image-Instanz. Wie kann ich also aus einem Icon-Object ein Image-Object machen oder wie kann ich von einem File direkt eine Image-Instanz erzeugen?

Code:
ImageDescriptor desc = ImageDescriptor.createFromFile(null,file.getAbsolutePath());
Image image = desc.createImage();

habe ich auch schon probiert, funtzt aber net... wahrscheinlich wegen null als erster Parameter.

Kann mir jemand helfen... Es ist sichlich ne simple Sache, nur ich find sie bzw. sehe sie net.
 
Wenn du mit SWT programmierst solltest du das nicht mit AWT mischen wenn es nicht unbedingt nötig ist.

In SWT kannst du ein Image sehr einfach erzeugen:
SWT API: Image

Also im Zweifelsfall:
Java:
Image i = new Image(Display.getDefault(), "C:\\graphic.bmp");

Nicht vergessen das Bild mit i.dispose() wieder freizugeben wenn es nicht mehr benötigt wird. Memory Leaks sind sehr unschön.

Abgesehen davon gehört der TreeViewer nicht direkt zu SWT sondern zu JFace.
 
...dass ist mir schon klar. Ich möchte aber die Systemicons von Dateien und Verzeichnisse anzeigen so wie im Windows-Explorer und nicht einfach nur Bilder laden.
 
Also wenn es eine PDF Datei ist möchtes du das im System registrierte Icon dazu haben?

Das geht mit:
Java:
Program prog = Program.findProgram("pdf");
ImageData imgData = prog.getImageData();
Image img = new Image(Display.getDefault(),imgData);
 
ja, genau... ich hab hierzu jetzt auch schon einen ersten Ansatz... und zwar die Icons zunächst über die FileSystemView besorgen, dann daraus ein BufferedImage erzeugen... von diesem das ColorModel in SWT transferieren und ein ImageDate erzeugen.

Code:
public ImageData getImageData() {
      Icon icon = FileSystemView.getFileSystemView().getSystemIcon(file);
      BufferedImage image = new BufferedImage(icon.getIconWidth(),icon.getIconHeight(),BufferedImage.TYPE_BYTE_INDEXED);
      icon.paintIcon(null, image.getGraphics(), 0, 0);
      return convertToSWT(image);
   }

static ImageData convertToSWT(BufferedImage bufferedImage) {
    if (bufferedImage.getColorModel() instanceof DirectColorModel) {
      DirectColorModel colorModel = (DirectColorModel) bufferedImage
          .getColorModel();
      PaletteData palette = new PaletteData(colorModel.getRedMask(),
          colorModel.getGreenMask(), colorModel.getBlueMask());
      ImageData data = new ImageData(bufferedImage.getWidth(),
          bufferedImage.getHeight(), colorModel.getPixelSize(),
          palette);
      WritableRaster raster = bufferedImage.getRaster();
      int[] pixelArray = new int[3];
      for (int y = 0; y < data.height; y++) {
        for (int x = 0; x < data.width; x++) {
          raster.getPixel(x, y, pixelArray);
          int pixel = palette.getPixel(new RGB(pixelArray[0],
              pixelArray[1], pixelArray[2]));
          data.setPixel(x, y, pixel);
        }
      }
      return data;
    } else if (bufferedImage.getColorModel() instanceof IndexColorModel) {
      IndexColorModel colorModel = (IndexColorModel) bufferedImage
          .getColorModel();
      int size = colorModel.getMapSize();
      byte[] reds = new byte[size];
      byte[] greens = new byte[size];
      byte[] blues = new byte[size];
      colorModel.getReds(reds);
      colorModel.getGreens(greens);
      colorModel.getBlues(blues);
      RGB[] rgbs = new RGB[size];
      for (int i = 0; i < rgbs.length; i++) {
        rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF,
            blues[i] & 0xFF);
      }
      PaletteData palette = new PaletteData(rgbs);
      ImageData data = new ImageData(bufferedImage.getWidth(),
          bufferedImage.getHeight(), colorModel.getPixelSize(),
          palette);
      data.transparentPixel = colorModel.getTransparentPixel();
      WritableRaster raster = bufferedImage.getRaster();
      int[] pixelArray = new int[1];
      for (int y = 0; y < data.height; y++) {
        for (int x = 0; x < data.width; x++) {
          raster.getPixel(x, y, pixelArray);
          data.setPixel(x, y, pixelArray[0]);
        }
      }
      return data;
    }
    return null;
  }


jedoch habe ich noch folgendes Problem... und zwar ist der Hintergrund der angezeigten Pixel der SystemIcons Schwarz, das liegt wahrscheinlich daran, dass die Transparenten Pixel nicht richtig convertiert bzw. interpretiert werden.

Ich habe die Konstante des verwendeten ColorModel einfach selbst gesetzt (geraten), was nicht gut ist. Wie komme ich an das verwende ColorModel des Icons ran, um dann die richtige Konstante bei der Erzeugung des BufferedImage zu setzen?
 
nein... es sucht nur nach Programme mit Hilfe der File-Extension. So müsste ich von jeder Datei die Extension Extrahieren und dann danach suchen (ineffizient)... und was ist mit dem SystemIcon von Ordnern wie komme ich dann daran?
 
Howdie.

Mit SWT kenne ich mich nicht aus, und weiß nicht, ob du da Swing-Komponenten verwenden kannst. Auf die Gefahr hin, dass dir das nichts bringt:
Java:
import javax.swing.filechooser.FileSystemView;

File myFile = new File("blubb");
FileSystemView fsView = FileSystemView.getFileSystemView();
fsView.getSystemIcon(myFile); // gibt ein javax.swing.Icon interface zurück
Falls das nichts ist, gibt es vielleicht ein Äquivalent für SWT.

Gruß und viel Erfolg,
miffi
 
Zurück