如何锁定 swt Table 或 Jface tableviewer 滚动条
How to lock swt Table or Jface tableviewer scrollbar
我有一个 Table 查看器,其中添加对象的速度非常快,我需要用户能够 select 某些元素。问题是我找不到让滚动条停止滚动的方法。我只想要一个按钮,它将 Table 锁定在当前位置。
也许你有答案。
[编辑]
:
您可以像 Eclipse 控制台那样使用 Toggle 按钮。您需要维护按钮事件的以下两种状态。
- table#setSelection(item) 将 select 添加的最后一项。(Auto Scroll)
- tableviewer#refresh(object,true,false) 可用于保留 selection(Scroll Lock).
在这里,我创建了代码段,它可以帮助您了解如何在 tableviewer 中使用刷新:
public class SamplePart {
private static int i = 1;
private Text txtInput;
private TableViewer tableViewer;
@Inject
private MDirtyable dirty;
private Table table;
private TableColumn column;
private Button btnNewButton;
@PostConstruct
public void createComposite(Composite parent) {
parent.setLayout(new GridLayout(2, false));
txtInput = new Text(parent, SWT.BORDER);
txtInput.setMessage("Enter text to mark part as dirty");
txtInput.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
dirty.setDirty(true);
}
});
txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
btnNewButton = new Button(parent, SWT.TOGGLE);
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(!btnNewButton.getSelection()){
//once button is pressed it will preserve the selection
tableViewer.refresh( table , true, false);
}
}
});
btnNewButton.setText("scroll");
tableViewer = new TableViewer(parent);
table = tableViewer.getTable();
column = new TableColumn(table, SWT.NONE);
column.setText("Column " + 0);
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "sample Item " );
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 2;
gridData.widthHint = 440;
tableViewer.getTable().setLayoutData(gridData);
Job job = new Job("UI") {
@Override
protected IStatus run(IProgressMonitor monitor) {
for(int j = 1 ; j<10000000; j++){
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
addItem();
table.getColumn(0).pack();
}
});
}
return ASYNC_FINISH;
}
};
job.schedule();
}
private void addItem() {
i++;
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "sample Item "+i );
if(!btnNewButton.getSelection()){
table.setSelection(item);
}
}
@Focus
public void setFocus() {
tableViewer.getTable().setFocus();
}
@Persist
public void save() {
dirty.setDirty(false);
}
}
我有一个 Table 查看器,其中添加对象的速度非常快,我需要用户能够 select 某些元素。问题是我找不到让滚动条停止滚动的方法。我只想要一个按钮,它将 Table 锁定在当前位置。
也许你有答案。
[编辑] : 您可以像 Eclipse 控制台那样使用 Toggle 按钮。您需要维护按钮事件的以下两种状态。
- table#setSelection(item) 将 select 添加的最后一项。(Auto Scroll)
- tableviewer#refresh(object,true,false) 可用于保留 selection(Scroll Lock).
在这里,我创建了代码段,它可以帮助您了解如何在 tableviewer 中使用刷新:
public class SamplePart {
private static int i = 1;
private Text txtInput;
private TableViewer tableViewer;
@Inject
private MDirtyable dirty;
private Table table;
private TableColumn column;
private Button btnNewButton;
@PostConstruct
public void createComposite(Composite parent) {
parent.setLayout(new GridLayout(2, false));
txtInput = new Text(parent, SWT.BORDER);
txtInput.setMessage("Enter text to mark part as dirty");
txtInput.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
dirty.setDirty(true);
}
});
txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
btnNewButton = new Button(parent, SWT.TOGGLE);
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(!btnNewButton.getSelection()){
//once button is pressed it will preserve the selection
tableViewer.refresh( table , true, false);
}
}
});
btnNewButton.setText("scroll");
tableViewer = new TableViewer(parent);
table = tableViewer.getTable();
column = new TableColumn(table, SWT.NONE);
column.setText("Column " + 0);
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "sample Item " );
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 2;
gridData.widthHint = 440;
tableViewer.getTable().setLayoutData(gridData);
Job job = new Job("UI") {
@Override
protected IStatus run(IProgressMonitor monitor) {
for(int j = 1 ; j<10000000; j++){
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
addItem();
table.getColumn(0).pack();
}
});
}
return ASYNC_FINISH;
}
};
job.schedule();
}
private void addItem() {
i++;
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "sample Item "+i );
if(!btnNewButton.getSelection()){
table.setSelection(item);
}
}
@Focus
public void setFocus() {
tableViewer.getTable().setFocus();
}
@Persist
public void save() {
dirty.setDirty(false);
}
}