Eclipse插件开发:垂直滚动表?

Mar*_*rer 0 java eclipse user-interface swt eclipse-plugin

我正在尝试在对话框中创建一个垂直滚动表,但没有成功.当我创建表格时,无论屏幕大小/分辨率如何,它都会自动扩展到需要的任何高度.大量数据创建的表格远远低于屏幕底部.

我的代码是这样的(不是逐字的,可能是一个类型-o或两个):

final Table table = new Table(parent, SWT.SINGLE | 
  SWT.FULL_SELECTION | SWT.SCROLL_LINE | borderStyle | orientation );
table.setHeaderVisible(true);
table.setLinesVisible(true);

TableViewer tableView = new TableViewer(table);

// code yanked to set up the columns (movable == false, 
// resiable == true, with set text, widths, and toolTipText)

tableView.setContentProvider(new ArrayContentProvider());
// BeanLabelProvider's getColumnText returns the beanDescriptor's
// getReadMethod.invoke().toString()
tableView.setLabelProvider(new BeanLableProvider(MyClass.class));
tableView.setInput(anArrayOfMyClass);
Run Code Online (Sandbox Code Playgroud)

所有这些代码都存在于我的对话框类的createDialogArea()中.

无论如何,我尝试过以下方法:

  1. treeView.setItemCount() 修剪数据,它不会限制显示的数据量.
  2. table.getVerticalBar()返回一个有效的ScrollBar,那个scrollbar.getVisible() == true;?!真?证明给我看.不这么认为. setVisible(true)什么也没做.
  3. table.setBounds()?不.即使我打电话layout()和/或redraw().
  4. 以上是在内部完成的createDialogArea().如果我setBounds()在MyDialog.initializeBounds()内调用它会收缩表并添加滚动条(喘息!),但对话框不会调整大小.调用table.getParent().layout(true)调整表的大小,而不是对话框.Augh!
  5. 在initBounds中,我有以下代码:

    Shell shell = getShell();
    shell.setBounds(foo, bar, baz qux);
    myTable.setBounds(foo, bar, baz-fudgeX, qux-fudgeY);
    myTable.getVerticalBar().setVisible(true); // see, it wasn't null!
    // this line doesn't seem to have any effect, I can comment it out and have
    // the same apparent result.
    shell.layout(true);
    // If I call shell.pack() the table snaps back to its original size (huge).
    
    Run Code Online (Sandbox Code Playgroud)

如果没有调用pack(),则会在对话框的底部剪切okay/cancel按钮.有了它,整个练习都没有实际意义.

为什么我会感觉到我错过了一些真正基本的东西,当别人指出它时,我会想要砸我的额头?

the*_*man 5

你用什么布局Shell?在调用期间,大多数布局只是询问控件的首选大小layout().表的首选大小是大小,可以显示所有行.如果没有更多约束,布局会将Shell的大小调整为首选大小,这不是您想要的.

为防止这种情况,您需要在表格上为布局设置高度提示.一个例子是这个片段.如果删除该行

data.heightHint = 200;
Run Code Online (Sandbox Code Playgroud)

由此产生的壳太高了.