2012-04-04 9 views
2

Ich habe einen Baum, der mit TreeItems gefüllt ist, die ein Bild (eine Zeile mit einem Thumbnail) haben können. Ich ändere die Zeilenhöhe mit MeasureItem Listener, und alles ist gut.Zeilenhöhe in SWT ändern Tabelle/Struktur

Aber jetzt möchte ich diese Änderung dynamisch machen. Ich überprüfe, ob eine Zeile ein Bild haben sollte, und wenn eine Zeile in den aktuell aufgelisteten Zeilen ein Bild hat, das angezeigt werden soll, setze ich die Zeilenhöhe auf 180px, und alle Zeilen haben diese Höhe. Wenn keine Zeile mit einem Bild vorhanden ist, sollte die Zeilenhöhe 25 Pixel betragen.

Das Problem ist, wenn zu jeder Zeit die Zeilenhöhe auf 180px eingestellt ist, kann ich nicht zurück zu 25px ändern. Mein Code sieht wie folgt aus (vereinfacht):

//this check is run on each page of paginated results fetched from DB 
rowHeight=25; 
for(Result r : results){ 
    if(r.hasImage()){ 
     rowHeight=180; 
     break; 
    } 
} 


    // resize the row height using a MeasureItem listener 
    tree.addListener(SWT.MeasureItem, new Listener() { 
     public void handleEvent(Event event) { 
      event.height = rowHeight; 
     } 
    }); 

    //added 'event.height=rowHeight' here just to check if it will draw as I want 
    tree.addListener(SWT.EraseItem, new Listener() { 
     public void handleEvent(Event event) { 
      if(event.index!=ColumnType.SCREENSHOT.toIndexNum()){ 
       event.detail &= ~SWT.FOREGROUND; 
      } 
      event.height=rowHeight; 
     } 
    }); 

Die rowHeight Variable gesetzt ist, wie es sollte, und auch die ‚event.height‘ im MeasureListener auf den gleichen Wert eingestellt. Trotzdem möchte ich die Höhe nicht reduzieren. Auf jeder Ergebnisseite lösche ich die Artikel mit tree.removeAll(). Vielleicht sollte ich die Tabelle/den Baum entsorgen und neu erstellen (was ich nicht tun möchte)?

Also, irgendeine Idee, wie es geht?

P. S. Nicht zu verwechseln, brauche ich nicht verschiedene Höhen in den Zeilen, ich weiß, dass es unter Windows/Mac nicht möglich ist. Ich brauche nur einen Weg, um die Höhe zurückzusetzen.

Antwort

0

Die Tatsache, dass Sie die Höhe der Zeilen nicht verringern können, ist ein known bug.

+0

Danke den Fehler für den Hinweis. Ich beendete das Neuzeichnen der gesamten Tabelle für jede Seite der Ergebnisse als Umgehung. – ekstrakt

-4

http://www.exampledepot.com/egs/javax.swing.tree/RowHeight.html

funktioniert gut für dynamische Zeilenhöhen.

// Create tree 
JTree tree = new JTree(); 

// All rows will be given 15 pixels of height 
tree.setRowHeight(15); 

// Have the row height for each row computed individually 
tree.setRowHeight(0); 

// If the row height is 0 and the height of a row has dynamically changed, it is  necessary 
// to flush the internal cache of row heights. The following calls flush the  internal  cache. 
if (tree.getRowHeight() <= 0) { 
// Temporary change to non-zero height 
tree.setRowHeight(1); 
} 
tree.setRowHeight(0); 
+1

Das ist nicht SWT. –

2

Ich fand eine weitere Problemumgehung für diesen Fehler. Ich wollte die Höhe der Tabellenzeilen ändern, wenn Sie die Größe des Fensters (Tabelle) ändern, weil das manuelle Umbrechen von Wörtern in den Tabellenzellen erfolgt. Mit dem folgenden Listener für die SWT-Shell wurden die Tabellenzellen ordnungsgemäß verkleinert.

shell.addListener(SWT.Resize, new Listener() { 
    @Override 
    public void handleEvent(Event event) { 
     table.setFont(table.getFont()); 
    } 
}); 
+0

Interessante Idee, ich gebe jetzt ein upvote, und ich werde es später testen, um zu sehen, ob es auf meinen Tisch angewendet werden kann (jetzt ist es eine Mischung aus allem) (formatierter Text, Kombinationsfelder ...)) Danke für die Antwort nach all der Zeit :) – ekstrakt

+0

Okay, das funktioniert nicht unter Windows. Kann Mac nicht testen. – attrib

4

Problem mit Baum und Tabelle das gleiche. setFont hovever nichts tun. Baum und Tabelle haben Methode setItemHeight (int itemHeigh) Durch Reflexion Sie diese Methode aufrufen können (siehe https://bugs.eclipse.org/bugs/attachment.cgi?id=220735)

Für Tisch colum Sie Hörer auf Resize Zelle hinzufügen und diese Methode durch Reflexion aufrufen (durch den Link beschrieben):

TableColumn column = new TableColumn(table, SWT.CENTER, i); 
column.addListener(SWT.Resize, new Listener() { 
    @Override 
    public void handleEvent(Event event) { 
     int min = 10; 
     setItemHeight(table, min); 
    } 
}); 

min - ist Ihr Mindestwert für eine Zellenhöhe;

Nach dem in Tabelle Listener für Ereignis SWT.MeasureItem können Sie notwendige Höhe für Ihre Zellen eingestellt:

table.addListener(SWT.MeasureItem, new Listener() { 
     public void handleEvent(Event event) { 
     TableItem item = (TableItem)event.item; 
       String text = item.getText(event.index); 
     Point size = event.gc.textExtent(text); 
     event.height = Math.max(event.height, size.y); 
    } 
});