3
테이블 컨트롤이 포함 된 StyledText 위젯이 있습니다. 그러나 일단 표 셀의 크기를 조정하기 위해 MeasureItem 수신기를 추가하면 테이블은 처음 스크롤 할 때 StyledText 위젯 맨 위에 나타나며 예상되는 위치까지 스크롤 할 때까지 남아 있습니다.SWT StyledText - MeasureItem 수신기가있는 테이블이 위로 이동합니다.
이 것이 알려진 문제입니까? 내가 뭔가 잘못하고 있는거야?
코드 스 니펫 :
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();
}
}
? 테이블을 표시 설정?) -하지만이 문제는 확실히 해결됩니다. 고맙습니다! – Rini