2016-11-10 3 views
0

다음 코드 스 니펫이 있습니다.NatTable은 repaintCell 후에 수동 새로 고침이 필요합니까?

int index = getEventList().indexOf(myObj); 
    SelectionLayer selectionLayer = getGlazedListsGridLayer() 
     .getBodyLayerStack().getSelectionLayer();   
    getNatTable().repaintCell(0,selectionLayer.getRowIndexByPosition(index)); 

위의 코드를 실행하면 GUI에 표시된 테이블을 클릭 한 후 영향을받은 셀만 다시 그립니다. 그 코드를 주석 처리하고 getNatTable().refresh();을 사용하면 테이블을 처음 클릭 할 필요없이 다시 그릴 수 있습니다.

GUI에 표시된 테이블을 클릭하지 않고 셀을 다시 그릴 수있는 방법이 있습니까? 이 코드는 여러 번 실행될 수있는 큰 테이블에 대해 refresh()를 호출해야합니다.

+0

왜 수동으로 repaintCell()을 수동으로 호출 하시겠습니까? –

+0

외부 요인으로 인해 셀에 이미지가 변경 될 수 있습니다. – ekjcfn3902039

+0

좀 더 자세히 말하면 외부 코드가있는 콜백을 등록합니다. 콜백을 통해 myObj라는 객체를 얻고 myObj를 사용하여 변경할 셀을 결정합니다. repaintCell()을 호출하면 필요한 IConfigLabelAccumulator 코드가 다시 실행되어 표시 할 올바른 이미지를 결정합니다. IConfigLabelAccumulator 코드는 myObj를 사용하여 외부 서비스를 호출하여 그릴 이미지를 결정합니다. myObj의 외부에서 이미지가 판별되므로 테이블에 보유 된 데이터는 변경되지 않습니다. 즉, myObj에는 내부 값이 변경되지 않습니다. – ekjcfn3902039

답변

1

아니요. 다시 그리기를 트리거하기 위해 몇 가지 추가 단계를 수행 할 필요가 없습니다. 코드의 문제는 잘못된 인덱스 값을 사용하는 것입니다. 그리드가 있으므로 열 0은 NatTable 관점의 행 머리글입니다. NatTable 관점에서 인덱스 1 인 본문의 첫 번째 열을 다시 그리기를 원한다고 가정합니다. 또한 SelectionLayer에서 인덱스를 계산할 때 행 인덱스가 잘못되었지만 실제로 열 머리글 행만있는 경우에는 테이블에 인덱스가 필요합니다.

실제로 격자에 행 헤더 열과 행 머리글 행이 하나있는 경우 색인에 1을 추가하면 코드가 작동합니다.

getNatTable().repaintCell(1, selectionLayer.getRowIndexByPosition(index) + 1); 
+0

열을 정렬 할 때 다시 그리기가 예상대로 또는 수행되지 않을 수 있습니다. 아무런 운이나 이유도없고 적절한 아이콘을 표시하려면 행을 클릭해야합니다. 특정 셀을 새로 고칠 수있는 다른 호출이 있습니까? – ekjcfn3902039

+0

색인 위치 변환에 대해 읽어보십시오. NatTable에서 현재 보게되는 위치에서 작업합니다. 인덱스로 변환하면 인덱스는 기본 목록의 실제 데이터 위치를 나타내므로 다시 그리려는 셀은 표시되지 않을 수 있습니다. 시작 자습서 http://www.vogella.com/tutorials/NatTable/article.html –

+0

에 대한 장이 있습니다. 그렇다면 DataLayer를 기반으로 셀을 다시 칠하기로되어 있습니까? 이 기사를 읽었지만 주어진 코드 샘플을 사용하여 문제를 해결하는 방법에 대해서는 전혀 이해가되지 않습니다. – ekjcfn3902039