首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅冻结SWT NatTable中可见的列?

如何仅冻结SWT NatTable中可见的列?
EN

Stack Overflow用户
提问于 2016-10-06 01:40:04
回答 1查看 397关注 0票数 1

我现在让列/行冻结工作到可以右键单击列/行标题,然后单击“冻结”,它将冻结我单击的列和左边的所有列。问题是,如果我向右滚动,然后单击如列索引20 (实际上是任何隐藏了左侧索引的索引),它将冻结该索引以下的所有列,这将导致表恢复到索引0,而不允许我滚动(因为冻结的列比显示的列多)。如何只冻结我单击的列左边的可见列?我偶然发现了IFreezeCoordinatesProvider,并试图用它做一些厚颜无耻的事情,但没有结果。下面是我创建右键菜单的自定义配置,其中包含冻结命令。任何帮助都是非常感谢的!

代码语言:javascript
复制
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));
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-06 09:06:56

现在,FreezeColumnCommand不支持所请求的特性。只有FreezeSelectionCommand能够通过移动视图之外不可见的左侧列来执行冻结操作。原因是对应的FreezeColumnStrategy在计算冻结坐标时没有考虑到当前的viewport状态。这肯定是要在NatTable中修复的,我为此创建了一张票证:bug.cgi?id=504489

在NatTable中修复之前,您可以直接使用FreezeHelper。这会将冻结的内部计算和处理暴露在通常应该避免的代码中,但现在这将是一个解决办法。

此外,您的菜单配置不遵循NatTable准则。您正在做的许多事情都不合适,例如创建自己的菜单,但使用PopupMenuBuilder。下面是使用NatTable 1.4的代码。

代码语言:javascript
复制
public class ColumnHeaderRightClickConfiguration extends AbstractUiBindingConfiguration {

    private Menu rightClickMenu;

    private boolean frozen = false;

    public ColumnHeaderRightClickConfiguration(
            NatTable natTable,
            CompositeFreezeLayer compositeFreezeLayer,
            FreezeLayer freezeLayer,
            ViewportLayer viewportLayer,
            SelectionLayer selectionLayer) {
        this.rightClickMenu = new PopupMenuBuilder(natTable)
                .withMenuItemProvider("freeze", new IMenuItemProvider() {

                    @Override
                    public void addMenuItem(NatTable natTable, Menu popupMenu) {
                        MenuItem freezeLeft = new MenuItem(popupMenu, SWT.NONE);
                        freezeLeft.setText("Freeze");

                        freezeLeft.addSelectionListener(new SelectionAdapter() {
                            @Override
                            public void widgetSelected(SelectionEvent event) {
                                int columnPosition = MenuItemProviders.getNatEventData(event).getColumnPosition();
                                int pos = LayerUtil.convertColumnPosition(natTable, columnPosition, selectionLayer);
                                // this should be the solution
                                // if (compositeFreezeLayer.doCommand(new FreezeColumnCommand(compositeFreezeLayer, pos, true))) {
                                //     ColumnHeaderRightClickConfiguration.this.frozen = true;
                                // }

                                int coordCol = 0;
                                coordCol = viewportLayer.getScrollableLayer()
                                        .getColumnPositionByX(viewportLayer.getOrigin().getX());
                                if (coordCol > 0
                                        && coordCol >= pos) {
                                    coordCol = pos;
                                }

                                PositionCoordinate topLeftPosition = new PositionCoordinate(freezeLayer, coordCol, -1);
                                PositionCoordinate bottomRightPosition = new PositionCoordinate(freezeLayer, pos, -1);

                                FreezeHelper.freeze(freezeLayer, viewportLayer, topLeftPosition, bottomRightPosition);
                                ColumnHeaderRightClickConfiguration.this.frozen = true;
                            }
                        });

                    }
                })
                .withMenuItemProvider("unfreeze", new IMenuItemProvider() {

                    @Override
                    public void addMenuItem(NatTable natTable, Menu popupMenu) {
                        MenuItem unfreeze = new MenuItem(popupMenu, SWT.NONE);
                        unfreeze.setText("Unfreeze");

                        unfreeze.addSelectionListener(new SelectionAdapter() {
                            @Override
                            public void widgetSelected(SelectionEvent event) {
                                natTable.doCommand(new UnFreezeGridCommand());
                                ColumnHeaderRightClickConfiguration.this.frozen = false;
                            }
                        });
                    }
                })
                .withEnabledState("freeze", new IMenuItemState() {

                    @Override
                    public boolean isActive(NatEventData natEventData) {
                        return !ColumnHeaderRightClickConfiguration.this.frozen;
                    }
                })
                .withEnabledState("unfreeze", new IMenuItemState() {

                    @Override
                    public boolean isActive(NatEventData natEventData) {
                        return ColumnHeaderRightClickConfiguration.this.frozen;
                    }
                })
                .build();

        natTable.addDisposeListener(new DisposeListener() {
            @Override
            public void widgetDisposed(DisposeEvent e) {
                ColumnHeaderRightClickConfiguration.this.rightClickMenu.dispose();
            }

        });
    }

    @Override
    public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
        MouseEventMatcher matcher = new MouseEventMatcher(
                SWT.NONE,
                GridRegion.COLUMN_HEADER,
                MouseEventMatcher.RIGHT_BUTTON);
        uiBindingRegistry.registerMouseDownBinding(
                matcher,
                new PopupMenuAction(this.rightClickMenu));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39886197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档