2012-09-28 13 views
6

Tengo un problema cuando agrego una imagen a cualquier columna de una tabla JFace la primera columna también se comporta como si tuviera una imagen y el texto está sangrado por el tamaño de esa imagen.Poner una imagen en una tabla JFace La celda está causando que la brecha para la imagen aparezca en la primera columna

Aquí hay una captura de pantalla que ilustra mi punto con el código necesario para producirlo. ¿Hay alguna forma de evitar que esto suceda porque realmente se está poniendo en mi mecha?

Saludos,

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; 
    } 
} 

Respuesta

2

Eso es un bug bastante molesto cuando se utiliza Windows. Puede usar una solución sucia omitiendo la primera columna (sin usarla) y estableciendo su ancho a cero.

Por lo que recuerdo correctamente, esto introducirá algunas fallas técnicas menores al usar MacOS.

+0

Me tomó 3 horas para reducir la razón por la que estaba recibiendo la brecha, otra media hora pasó buscando en Google el problema sin alegría y media hora más para escribir el escenario y publicar aquí. Tardó 3 minutos para responder mi pregunta. Felicitaciones mi amigo, felicitaciones. – Link19

+0

@GlenLamb Hace un tiempo estaba enfrentando el mismo problema. Es por eso que sabía cómo responder a su pregunta;) – Baz

1

TableItem línea: 301: Veo un problema con el código SWT aquí.

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); 

por primera visor de tablas con imagen, aquí de clave sea 1 por eso el texto de dibujo comenzó a coordinar iconRect derecha. para la segunda tabla viwer sin imagen, el código es cero. por lo que siempre comienza desde los límites reales.

Si está realmente interesado en arreglarlo en CellStyleStyledCellLabelProvider le sugiero que anule el método de pintura allí.

+0

Eso es interesante porque el informe de errores culpa a la ventana. – Link19

+0

Sí. Es Windows. anula el método de pintura e ignora ViewerCell.getTextBounds() para la primera columna y pinta tu texto si quieres que funcione hasta que se solucionen las ventanas de SWT. –

+0

El texto de la pintura tampoco funciona, porque el fondo que pinta alrededor del texto es blanco en lugar de transparente, lo que hace que los aspectos más destacados se vean terribles, mucho peores que la brecha. – Link19

2

Tuve el mismo problema y lo solucioné utilizando StyledCellLabelProvider con el dibujo del propietario y reemplazando el método de pintura para pintar la imagen. El punto es que no debes configurar la imagen de la celda del visor porque esto dará el error. Publiqué un código de ejemplo para el informe de error de Eclipse.

Cuestiones relacionadas