문제

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 플래그를 사용할 때는 항목이 보는 경우에만 생성됩니다. 다음은 다음과 같은 방법입니다.

  1. 스타일 swt.virtual으로 테이블을 만듭니다
  2. 테이블#setitemcount ()를 사용하여 행 카운트 설정
  3. 주문형 테이블 시멘트를 채우는 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();
}

다른 팁

테이블 디스플레이에서 게으른로드를하고 싶습니다. 기본적 으로이 모든 객체를 메모리에서 오프 스크린으로 유지 한 다음 소수의 실제 GUI 테이블 행만 만듭니다. 사용자가 스크롤함에 따라 해당 스크롤 위치의 객체와 함께이 행을 다시 렌더링합니다.

보다 이 기사 (편집 : 죄송합니다 이 기사) Jface 예제.

1- settext (int, string) 대신 몇 가지 대신 하나의 호출 대신 settext (string [])을 사용하십시오.

2- MyTable.SetRedRaw (False) 이전 및 MyTable.SetRedRaw (True)를 사용한 후 데이터로드 중에 모든 재단을 중지하는 프로세스 후.

더 간단하고 성능을 향상시킬 수 있습니다 !!

행운을 빕니다.

내 측면에서 나는 300ms 미만의 20 열의 2500 줄을 표준 PC에로드합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top