问题
I created a CheckboxTableViewer to show a list of stuff as shown in figure below. The problem are the scrollbars of the table are not working as it should. May be I am missing some layout parameters for the table?
And here is the code:
public class TableViewerClass {
CheckboxTableViewer tableViewer;
private GridData gridData;
private List<String> checkListNames = new ArrayList<String>();
public TableViewerClass(Shell parent){
checkListNames.add("Function Trace 1");
checkListNames.add("Function Trace 2");
checkListNames.add("Function Trace 3");
checkListNames.add("Function Trace 4");
checkListNames.add("Function Trace 5");
checkListNames.add("Function Trace 6");
createCheckViewer(parent);
createControlBox(parent);
}
private void createCheckViewer(Composite parent){
tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.SINGLE| SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
gridData = new GridData(SWT.TOP, SWT.TOP, false, false, 3, 1);
tableViewer.add(checkListNames.get(0));
tableViewer.add(checkListNames.get(1));
tableViewer.add(checkListNames.get(2));
tableViewer.add(checkListNames.get(3));
tableViewer.add(checkListNames.get(4));
tableViewer.add(checkListNames.get(5));
tableViewer.add(checkListNames.get(0));
tableViewer.add(checkListNames.get(1));
tableViewer.add(checkListNames.get(2));
tableViewer.add(checkListNames.get(3));
tableViewer.add(checkListNames.get(4));
tableViewer.add(checkListNames.get(5));
tableViewer.add(checkListNames.get(0));
tableViewer.add(checkListNames.get(1));
tableViewer.add(checkListNames.get(2));
tableViewer.add(checkListNames.get(3));
tableViewer.add(checkListNames.get(4));
tableViewer.add(checkListNames.get(5));
// define layout for the viewer
GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
tableViewer.getControl().setLayoutData(gridData);
final Table table = tableViewer.getTable();
TableLayout layout = new TableLayout();
TableViewerColumn col = new TableViewerColumn(tableViewer, SWT.LEAD);
col.getColumn().setText("Text");
layout.addColumnData(new ColumnWeightData(500));
table.setLayout(layout);
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
private void createControlBox(Composite parent){
Group group = new Group(parent, SWT.NONE);
group.setText("Control Box");
gridData = new GridData(SWT.LEFT, SWT.TOP, true, false,1,1);
group.setLayoutData(gridData);
FillLayout fillLayout = new FillLayout();
fillLayout.type = SWT.VERTICAL;
group.setLayout(fillLayout);
Button button = new Button(group, SWT.PUSH);
button.setText("Select All");
Button button2 = new Button(group, SWT.PUSH);
button2.setText("Deselect All");
button.addSelectionListener(this.getSelectAllHandler());
button2.addSelectionListener(this.getDeselectAllHandler());
}
private SelectionListener getSelectAllHandler(){
SelectionListener selectAll = new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
tableViewer.setAllChecked(true);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
};
return selectAll;
}
private SelectionListener getDeselectAllHandler(){
SelectionListener deselectAll = new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
tableViewer.setAllChecked(false);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
};
return deselectAll;
}
public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display);
shell.setSize(500, 400);
GridLayout layout = new GridLayout(4, false);
shell.setLayout(layout);
shell.setText("JFace Table Example");
new TableViewerClass(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
回答1:
The shell.pack()
call recomputes the size of the shell to make it fit the contents.
To restrict the size of the table you need to specify a height hint on the table:
GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
gridData.heightHint = 400; // Vertical size you want
tableViewer.getControl().setLayoutData(gridData);
来源:https://stackoverflow.com/questions/28410695/layout-setting-for-a-jface-table