0

現在、列/行のヘッダーを右クリックして「フリーズ」をクリックすると、クリックした列と左側のすべての列がフリーズするまで、列/行のフリーズが機能しています。問題は、右にスクロールして列インデックス 20 (実際には左側のインデックスを非表示にする任意のインデックス) をクリックすると、そのインデックスの下のすべての列がフリーズし、テーブルがインデックス 0 にスナップバックすることです。スクロールできません(表示されているよりも多くの列が固定されているため)。クリックした列の左側にある VISIBLE 列のみをフリーズするにはどうすればよいですか? 私は IFreezeCoordinatesProvider に出くわし、それで生意気なことをしようとしましたが、役に立ちませんでした。以下は、フリーズ コマンドを含む右クリック メニューを作成するためのカスタム構成です。どんな助けでも大歓迎です!

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));
}

}

4

1 に答える 1