현재 열/행 고정 기능을 사용하여 열/행 머리글을 마우스 오른쪽 단추로 클릭 한 다음 '고정'을 클릭하면 클릭 한 열이 고정됩니다. 및 모든 열은 왼쪽에 있습니다. 문제는 제가 오른쪽으로 스크롤하고 말하기 칼럼 인덱스 20 (실제로는 왼쪽에 인덱스를 숨기는 모든 인덱스)을 클릭하면 해당 인덱스 아래에있는 모든 열이 고정되어 인덱스 0에 다시 스냅되게됩니다. 표시된 것보다 더 많은 열이 고정되어 있기 때문에 스크롤을 허용하지 않습니다. 클릭 한 항목의 왼쪽에 보이는 열만 고정하려면 어떻게합니까? 나는 IFreezeCoordinatesProvider를 찾아 왔고 그걸 가지고 건방진 물건을 만들려고했으나 아무 소용이 없었습니다. 아래는 내 맞춤 구성으로 고정 명령을 포함하는 마우스 오른쪽 버튼 메뉴를 만드는 방법입니다. 어떤 도움이라도 대단히 감사합니다!SWT NatTable의 표시된 열만 고정하는 방법
public class ColumnHeaderRightClickConfiguration extends AbstractUiBindingConfiguration{
private final ViewportLayer viewportLayer;
private final CompositeFreezeLayer freezeLayer;
private Menu rightClickMenu;
private int localColumnIndex;
private int columnIndex;
private FreezeColumnCommand freezeCommand;
public ColumnHeaderRightClickConfiguration(final NatTable natTable, ViewportLayer viewportLayer, CompositeFreezeLayer freezeLayer){
this.viewportLayer = viewportLayer;
this.freezeLayer = freezeLayer;
this.rightClickMenu = createRightClickMenu(natTable).build();
natTable.addDisposeListener(new DisposeListener(){
@Override
public void widgetDisposed(DisposeEvent e) {
rightClickMenu.dispose();
}
});
}
private PopupMenuBuilder createRightClickMenu(NatTable natTable){
Menu menu = new Menu(natTable);
MenuItem freezeLeft = new MenuItem(menu, SWT.NONE);
freezeLeft.setText("Freeze");
MenuItem unfreeze = new MenuItem(menu, SWT.NONE);
unfreeze.setText("Unfreeze");
unfreeze.setEnabled(false);
freezeLeft.addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println(columnIndex);
freezeCommand = new FreezeColumnCommand(freezeLayer, columnIndex-1, true);
natTable.doCommand(freezeCommand);
freezeLeft.setEnabled(false);
unfreeze.setEnabled(true);
}
@Override
public void widgetDefaultSelected(SelectionEvent e){}
});
unfreeze.addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
natTable.doCommand(freezeCommand);
unfreeze.setEnabled(false);
freezeLeft.setEnabled(true);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
return new PopupMenuBuilder(natTable, menu);
}
@Override
public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
MouseEventMatcher matcher = new MouseEventMatcher(SWT.NONE, GridRegion.COLUMN_HEADER, MouseEventMatcher.RIGHT_BUTTON){
@Override
public boolean matches(NatTable natTable, MouseEvent event, LabelStack regionLabels){
if (super.matches(natTable, event, regionLabels)){
localColumnIndex = natTable.getColumnPositionByX(event.x);
columnIndex = viewportLayer.localToUnderlyingColumnPosition(localColumnIndex);
return true;
}else{
return false;
}
}
};
uiBindingRegistry.registerMouseDownBinding(matcher, new ColumnPopupMenuAction(rightClickMenu));
}
}
감사합니다. 참고로 버그를 발견했을 수도 있습니다. 말하기 색인 150을 클릭하면 오른쪽의 고정되지 않은 뷰포트 부분이 왼쪽에 숨겨진 색인의 양만큼 앞으로 이동합니다 (예 : 145-150이 얼어 붙을 때 볼 수 있다면 145 개의 지수로 점프 할 것입니다. 나는 단지 전화해서 이것을 바로 잡았다 viewportLayer.setOriginX (0); 이전 해결책으로 올바른 해결책을 구현할 때 freeze() 메서드에 해당 줄을 추가해야합니다. – Owen
고마워, 나는 또한 그것을 고쳤다. 최신 SNAPSHOT 빌드 (> = # 563)로 예상대로 작동해야합니다. –