2012-09-28 11 views
6

Quindi ho un problema, quando aggiungo un'immagine a qualsiasi colonna di una tabella JFace la prima colonna si comporta come se avesse un'immagine dentro e il testo è rientrato dalla dimensione di quell'immagine.Inserimento di un'immagine in una tabella JFace La cella causa un'interruzione dell'immagine nella prima colonna

Ecco uno screenshot che illustra il mio punto con il codice necessario per produrlo. C'è comunque modo di impedire che ciò accada perché è davvero sul mio stoppino?

saluti,

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

risposta

2

Questo è un abbastanza fastidioso bug quando si utilizza Windows. È possibile utilizzare una correzione sporca saltando la prima colonna (non usandola) e impostando la sua larghezza su zero.

Per quanto mi ricordi correttamente, questo introdurrà alcuni piccoli inconvenienti quando si utilizza MacOS.

+0

Mi ci sono volute 3 ore per restringere il motivo per cui stavo recuperando il vuoto, un'altra mezz'ora passata a cercare il problema senza gioia e un'altra mezz'ora per scrivere lo scenario e postare qui. Ci sono voluti 3 minuti per rispondere alla mia domanda. Complimenti amico mio, complimenti. – Link19

+0

@GlenLamb Ero di fronte allo stesso problema qualche tempo fa. Ecco perché sapevo come rispondere alla tua domanda;) – Baz

1

TableItem line: 301: vedo un problema con il codice SWT qui.

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

per il primo visualizzatore tavolo con immagini, ecco il codice è di 1 per questo che il testo disegno iniziato iconRect destra di coordinate. per la seconda tabella viwer senza immagine, il codice è zero. quindi inizia sempre dai limiti effettivi.

Se siete davvero interessati a risolvere il problema a CellStyleStyledCellLabelProvider vi suggerisco di ignorare il metodo di pittura lì.

+0

Questo è interessante perché la segnalazione dei bug blocca la finestra. – Link19

+0

Sì. È Windows. sovrascrivi il metodo paint e ignora ViewerCell.getTextBounds() per la prima colonna e dipinge il testo se vuoi farlo funzionare fino a quando le finestre SWT non vengono riparate. –

+0

Il testo di una pittura non funziona in realtà perché lo sfondo che disegna attorno al testo è bianco anziché trasparente, il che rende le alte luci terribili, molto peggio che avere la differenza. – Link19

2

Ho avuto lo stesso problema e ho lavorato attorno ad esso utilizzando un StyledCellLabelProvider con il proprietario e sovrascrivendo il metodo paint per dipingere l'immagine. Il punto è che non dovresti impostare l'immagine della cella del visualizzatore perché questo darà l'errore. Ho pubblicato un codice di esempio per la segnalazione del bug di Eclipse.

Problemi correlati