SWT/Jface RCP 응용 프로그램에서 거대한 테이블을 채우는 것
-
19-09-2019 - |
문제
SWT 테이블에 엄청난 양의 행을 표시하는 방법은 무엇입니까? 거대한 것은 20k 줄 이상, 20 개의 열 이상입니다. 왜 그 많은 데이터를 보여줄 필요가 있는지 묻지 마십시오. 그것은 요점이 아닙니다. 요점은 최종 사용자가 지루하지 않도록 가능한 빨리 작동하는 방법입니다. 각 행에는 일부 객체의 인스턴스가 표시되고 열은 속성 (일부)입니다. Jface 컨텐츠/레이블 제공자 패턴을 사용한다고 생각했지만 데이터로 직접 테이블을 치는 것보다 느리게 느려질 까봐 두려워합니다. 이것이 어떻게 진행되는지입니다.
Display.getDefault().asyncExec(new Runnable() {
public void run() {
List<MyObject> objects = model.getViewData();
for(MyObject object: objects){
TableItem item = new TableItem(table, SWT.NULL);
item.setImage(0, img1);
item.setBackground(color1);
item.setText(0, object.getProperty0());
item.setText(1, object.getProperty1());
item.setText(2, object.getProperty2());
.....
}
});
내 컴퓨터에 20k 레코드를 그리는 데 약 20 초가 걸립니다. Windows에서 본 가장 큰 성능 문제는 새 테이블 항목이 텍스트로 만들어지고 채워질 때 SWT가 보낸 놀라운 양의 기본 창 작성 메시지로 인해 발생합니다. 나는 이것에 대한 훌륭한 해결 방법을 찾았다 - 채워지기 전에 테이블을 숨긴 다음 완료되면 그것을 보여줍니다. 루프와 테이블 앞에서 테이블을 호출하기 만하면 (false) 루프가 궁금한 후 - 속도가 6 번 증가합니다!
더 속도를 높이고 싶습니다. 무엇을 제안 하시겠습니까? 또한 위젯을 숨기는이 속임수가 SWT (일명 Linux)의 비 창고 구현에서 어떻게 작동하는지 궁금합니다.
해결책
SWT는 당신을 위해 그렇게 할 수 있습니다. SWT.Virtual Style 플래그를 사용할 때는 항목이 보는 경우에만 생성됩니다. 다음은 다음과 같은 방법입니다.
- 스타일 swt.virtual으로 테이블을 만듭니다
- 테이블#setitemcount ()를 사용하여 행 카운트 설정
- 주문형 테이블 시멘트를 채우는 SWT.SETDATA 리스너를 추가하십시오.
코드 스 니펫은 다음과 같습니다.
public static void main( String[] args ) {
Display display = new Display();
Shell shell = new Shell( display );
shell.setLayout( new FillLayout() );
final Table table = new Table( shell, SWT.VIRTUAL );
table.setItemCount( 10000 );
table.addListener( SWT.SetData, new Listener() {
public void handleEvent( Event event ) {
TableItem item = (TableItem)event.item;
item.setText( "Item " + table.indexOf( item ) );
}
} );
shell.setSize( 300, 500 );
shell.open();
while( !shell.isDisposed() ) {
if( !display.readAndDispatch() ) {
display.sleep();
}
}
display.dispose();
}
다른 팁
1- settext (int, string) 대신 몇 가지 대신 하나의 호출 대신 settext (string [])을 사용하십시오.
2- MyTable.SetRedRaw (False) 이전 및 MyTable.SetRedRaw (True)를 사용한 후 데이터로드 중에 모든 재단을 중지하는 프로세스 후.
더 간단하고 성능을 향상시킬 수 있습니다 !!
행운을 빕니다.
내 측면에서 나는 300ms 미만의 20 열의 2500 줄을 표준 PC에로드합니다.