SWT StyledText - Tabla con MeasureItem oyente salta a la parte superior
-
12-10-2019 - |
Pregunta
I tiene un widget StyledText con controles tabla incrustada. Sin embargo, una vez que agrego un oyente MeasureItem para ajustar el tamaño de las celdas de la tabla, aparecerá el icono de mesa en la parte superior de la StyledText flash primera vez me desplazo, permaneciendo allí hasta que me desplazo hasta el final a la ubicación esperada.
Es este un problema conocido? ¿Estoy haciendo algo mal?
Fragmento de código:
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();
}
}
Solución
No tengo ni idea, ¿por qué haces esto, pero de todos modos ..
Su tabla no se encuentra adecuadamente después de la creación, y que "se sienta" en la base de coordenadas (0, 0). Así que hay que localizar la tabla a lugar correcto.
Añadir esta línea después de styledText.setStyleRange(style);
y funcionará como sea necesario.
table.setLocation(styledText.getLocationAtOffset(styledText.getCharCount()));
Y entonces no es necesario, para tener esta línea, puede eliminarla ..
table.setVisible(false); // *** prevents table from IMMEDIATELY jumping