現在、列/行の凍結が、列/行ヘッダーを右クリックして「フリーズ」をクリックすると、クリックした列がフリーズするまですべての列が左に表示されます。問題は、右にスクロールして、縦列のインデックス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)では、期待どおりに動作するはずです。 –