SWT StyledText - Tabelle mit MeasureItem Zuhörer springt nach oben
-
12-10-2019 - |
Frage
Ich habe einen StyledText Widget mit eingebetteter Tabelle Kontrollen. Doch sobald ich einen MeasureItem Hörer fügen Sie die Größe der Tabellenzellen einzustellen, die Tabelle erscheint am oberen Rand des StyledText Widget das erste Mal, dass ich bewegen, blieb dort, bis ich den ganzen Weg auf die erwartete Position bewegen.
Ist das ein bekanntes Problem? Bin ich etwas falsch nur tun?
Code-Snippet:
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.PaintObjectEvent;
import org.eclipse.swt.custom.PaintObjectListener;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.GlyphMetrics;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class JumpingTable {
public static void main(String[] args) {
// Initialize GUI
Display display = new Display();
Shell shell = new Shell(display);
// Create editor
StyledText styledText = new StyledText(shell, SWT.V_SCROLL);
shell.setLayout(new FillLayout());
// Insert lots of text
for (int i=0; i<100; ++i) {
styledText.append("Lorem ipsum\r\n");
}
// Create table
Table table = new Table(styledText, SWT.NONE);
table.setVisible(false); // *** prevents table from IMMEDIATELY jumping
for (int i=0; i<3; ++i) {
TableColumn column = new TableColumn(table, SWT.NONE);
column.setWidth(100);
}
for (int i=0; i<3; ++i) {
TableItem row = new TableItem(table, SWT.NONE);
row.setText(new String[] {"a", "b", "c"});
}
// Place table
int tableOffset = styledText.getCharCount();
styledText.append("\uFFFC"); // Object Replacement Code
StyleRange style = new StyleRange();
style.start = tableOffset;
style.length = 1;
style.data = table;
//table.pack();
table.setSize(300, 150); // accomodate MeasureItem's sizing
Rectangle rect = table.getBounds();
int ascent = 2*rect.height/3;
int descent = rect.height - ascent;
style.metrics = new GlyphMetrics(ascent, descent, rect.width);
styledText.setStyleRange(style);
// Draw table
styledText.addPaintObjectListener(new PaintObjectListener() {
@Override
public void paintObject(PaintObjectEvent event) {
Table table = (Table) event.style.data;
table.setVisible(true);
int y = event.y + event.ascent - event.style.metrics.ascent;
table.setLocation(event.x, y);
}
});
// Adjust sizing
table.addListener(SWT.MeasureItem, new Listener() {
@Override
public void handleEvent(Event event) {
if (event.type == SWT.MeasureItem) {
event.width = 100;
event.height = 50;
}
}
});
// Display GUI
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
// Clean up
display.dispose();
}
}
Lösung
Ich habe keine Ahnung, warum tun Sie das, aber trotzdem ..
Ihr Tisch ist nicht angemessen nach der Erstellung befindet, und es „sitzt“ auf Basis Koordinaten (0, 0). So haben Sie die Tabelle an die richtige Stelle zu finden.
Fügen Sie diese Zeile nach styledText.setStyleRange(style);
und es wird funktionieren, wie Sie benötigen.
table.setLocation(styledText.getLocationAtOffset(styledText.getCharCount()));
Und dann ist es nicht notwendig, diese Linie zu haben, können Sie es löschen ..
table.setVisible(false); // *** prevents table from IMMEDIATELY jumping