2012-09-28 6 views
6

So habe ich ein Problem, wenn ich ein Bild zu einer Spalte einer JFace-Tabelle hinzufügen die erste Spalte verhält sich auch wie es ein Bild hat in und der Text wird um die Größe dieses Bildes eingerückt.Ein Bild in eine JFace-Tabelle einfügen Zelle verursacht Lücke für Bild in der ersten Spalte

Hier ist ein Screenshot, der meinen Punkt mit dem Code illustriert, der benötigt wird, um ihn zu produzieren. Gibt es trotzdem etwas zu verhindern, weil es wirklich auf meinen Docht zugeht?

Grüße,

Glen x

enter image description here

package widgets; 

import java.util.ArrayList; 
import java.util.List; 

import org.eclipse.jface.viewers.ArrayContentProvider; 
import org.eclipse.jface.viewers.StyledCellLabelProvider; 
import org.eclipse.jface.viewers.TableViewer; 
import org.eclipse.jface.viewers.TableViewerColumn; 
import org.eclipse.jface.viewers.ViewerCell; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.graphics.Image; 
import org.eclipse.swt.graphics.ImageData; 
import org.eclipse.swt.graphics.PaletteData; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Display; 

import org.eclipse.swt.widgets.Shell; 

public class ComponentTest { 

    private static Image image; 

    public static void main(String[] args) { 
     final Display display = new Display(); 
     final Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(1, true)); 

     TableViewer viewer1 = getViewer(shell, true); 
     TableViewer viewer2 = getViewer(shell, false); 

     List<String> rows = new ArrayList<String>(); 
     rows.add("Row 1"); 
     rows.add("Row 2"); 

     viewer1.setInput(rows); 
     viewer2.setInput(rows); 

     shell.pack(); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    private static TableViewer getViewer(final Shell shell, boolean addImage) { 
     TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION 
       | SWT.H_SCROLL | SWT.V_SCROLL | SWT.NONE); 

     viewer.setContentProvider(ArrayContentProvider.getInstance()); 

     viewer.getTable().setLayoutData(
       new GridData(SWT.FILL, SWT.FILL, true, true)); 

     TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE); 
     col.getColumn().setWidth(100); 
     col.getColumn().setText("Text Column"); 
     col.setLabelProvider(new StyledCellLabelProvider() { 
      @Override 
      public void update(ViewerCell cell) { 
       cell.setText((String) cell.getElement()); 
      } 
     }); 

     col = new TableViewerColumn(viewer, SWT.NONE); 
     col.getColumn().setWidth(100); 
     col.getColumn().setText("Second Text Column"); 
     col.setLabelProvider(new StyledCellLabelProvider() { 
      @Override 
      public void update(ViewerCell cell) { 
       cell.setText((String) cell.getElement()); 
      } 
     }); 

     if (addImage) { 
      col = new TableViewerColumn(viewer, SWT.NONE); 
      col.getColumn().setWidth(100); 
      col.getColumn().setText("Image Column"); 
      col.setLabelProvider(new StyledCellLabelProvider() { 
       @Override 
       public void update(ViewerCell cell) { 
        cell.setImage(getImage(shell.getDisplay())); 
       } 
      }); 
     } 
     viewer.getTable().setHeaderVisible(true); 

     return viewer; 
    } 

    // make a little green square 
    private static Image getImage(Display display) { 
     if (image == null) { 
      PaletteData palette = new PaletteData(0xFF, 0xFF00, 0xFF0000); 
      ImageData imageData = new ImageData(16, 16, 24, palette); 

      for (int x = 0; x < 16; x++) { 
       for (int y = 0; y < 16; y++) { 
        imageData.setPixel(x, y, 0xFF00); 
       } 
      } 
      ; 
      image = new Image(display, imageData); 
     } 
     return image; 
    } 
} 

Antwort

2

Das ist ein ziemlich ärgerlich bug ist, wenn Windows. Sie können eine fehlerhafte Bereinigung verwenden, indem Sie die erste Spalte überspringen (nicht verwenden) und ihre Breite auf Null setzen.

Soweit ich mich richtig erinnere, bringt dies einige kleine Fehler bei der Verwendung von MacOS.

+0

Ich brauchte drei Stunden, um den Grund für die Lücke zu finden, eine weitere halbe Stunde, um das Problem ohne jede Freude zu googlen und eine weitere halbe Stunde, um das Szenario zu schreiben und hier zu schreiben. Sie haben 3 Minuten gebraucht, um meine Frage zu beantworten. Kudos mein Freund, Kudos. – Link19

+0

@GlenLamb Ich hatte vor einer Weile das selbe Problem. Deshalb wusste ich, wie man deine Frage beantwortet;) – Baz

1

TableItem Linie: 301: Ich sehe ein Problem mit SWT-Code hier.

if (code == 0) return new RECT(); 
      if (!getImage) { 
       RECT iconRect = new RECT(); 
       iconRect.left = OS.LVIR_ICON; 
       parent.ignoreCustomDraw = true; 
       code = OS.SendMessage (hwnd, OS. LVM_GETITEMRECT, row, iconRect); 
       parent.ignoreCustomDraw = false; 
       if (code != 0) rect.left = iconRect.right; 


//****problem 
    code = OS.SendMessage (hwnd, OS. LVM_GETITEMRECT, row, iconRect); 

für die erste Tabelle Betrachter mit Bild, hier ist der Code 1, warum Zeichnung Text iconRect rechts koordinieren gestartet. für die zweite Tabelle viwer ohne Bild, Code ist Null. Es beginnt also immer mit den tatsächlichen Grenzen.

Wenn Sie wirklich daran interessiert sind, es bei CellStyleStyledCellLabelProvider zu beheben, würde ich vorschlagen, dass Sie dort die Farbmethode überschreiben.

+0

Das ist interessant, weil der Fehlerbericht Fenster beschuldigt. – Link19

+0

Ja. Es ist Fenster. überschreiben Sie die Paint-Methode und ignorieren Sie ViewerCell.getTextBounds() für die erste Spalte und malen Sie Ihren Text, wenn Sie wollen, dass es funktioniert, bis SWT-Fenster behoben ist. –

+0

Maltext funktioniert auch nicht wirklich, weil der Hintergrund, den er um den Text herum malt, eher weiß als transparent ist, was dazu führt, dass die Lichter schrecklich aussehen, viel schlimmer als die Lücke. – Link19

2

Ich hatte das gleiche Problem und arbeitete um ihn herum, indem ich einen StyledCellLabelProvider mit Eigentümer zeichne und überschreibe die Anstrichmethode, um das Bild zu malen. Der Punkt ist, dass Sie das Bild der Betrachterzelle nicht einstellen sollten, weil dies den Fehler ergibt. Ich habe einen Beispielcode in den Eclipse-Fehlerbericht geschrieben.