Eclipse SWT 固定 table 高度,显示滚动条
Eclipse SWT fixed table height, show scrollbar
我有以下问题...
我有一个对话框,其中包含一个 TabFolder,它本身包含一个 TabItem,里面有一个 Table。 Table 有大量的项目,导致它不仅扩大了自己的高度,而且扩大了整个 shell 的高度(这是这里的主要问题)。我不想这样,我希望 table 具有固定高度和垂直滚动条。
我整理了一个简化的代码示例,它显示了我的问题:
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Composite contentComposite = new Composite(shell, SWT.NONE);
contentComposite.setLayout(new GridLayout(4, false));
Composite tableComposite = new Composite(contentComposite, SWT.NONE);
tableComposite.setLayout(new GridLayout());
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
TabFolder tabFolder = new TabFolder(tableComposite, SWT.NONE);
TabItem tabItem1 = new TabItem(tabFolder, SWT.NONE);
tabItem1.setText("Item 1");
TabItem tabItem2 = new TabItem(tabFolder, SWT.NONE);
tabItem2.setText("Item 2");
Table table = new Table(tabFolder, SWT.BORDER | SWT.V_SCROLL);
table.setLinesVisible(true);
table.setHeaderVisible(true);
String[] titles = { " ", "C", "!", "Description", "Resource", "In Folder", "Location" };
for (int i = 0; i < titles.length; i++) {
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText(titles[i]);
}
for (int i = 0; i < 100; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "x");
item.setText(1, "y");
item.setText(2, "!");
item.setText(3, "this stuff behaves the way I expect");
item.setText(4, "almost everywhere");
item.setText(5, "some.folder");
item.setText(6, "line " + i + " in nowhere");
}
for (int i=0; i<titles.length; i++) {
table.getColumn (i).pack ();
}
table.setSize(200, 200);
tabItem1.setControl(table);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
设置 table 大小没有帮助,因为这总是在填充后发生,因此会改变其他所有内容的大小。
我认为您需要决定 table 的 期望 高度应该是多少。例如 20 行 。然后您可以指定布局提示(以像素为单位)。如果像您的情况一样,table 的父级 GridLayout
,您可以像这样设置 table 的 GridData
:
GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true );
gridData.heightHint = 20 * table.getItemHeight();
table.setLayoutData( gridData );
如果其父项具有管理 table 的大小和位置的布局,则显式设置 table 的大小(table.setSize(200, 200)
在您的代码段中)无效。
我有以下问题...
我有一个对话框,其中包含一个 TabFolder,它本身包含一个 TabItem,里面有一个 Table。 Table 有大量的项目,导致它不仅扩大了自己的高度,而且扩大了整个 shell 的高度(这是这里的主要问题)。我不想这样,我希望 table 具有固定高度和垂直滚动条。
我整理了一个简化的代码示例,它显示了我的问题:
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Composite contentComposite = new Composite(shell, SWT.NONE);
contentComposite.setLayout(new GridLayout(4, false));
Composite tableComposite = new Composite(contentComposite, SWT.NONE);
tableComposite.setLayout(new GridLayout());
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
TabFolder tabFolder = new TabFolder(tableComposite, SWT.NONE);
TabItem tabItem1 = new TabItem(tabFolder, SWT.NONE);
tabItem1.setText("Item 1");
TabItem tabItem2 = new TabItem(tabFolder, SWT.NONE);
tabItem2.setText("Item 2");
Table table = new Table(tabFolder, SWT.BORDER | SWT.V_SCROLL);
table.setLinesVisible(true);
table.setHeaderVisible(true);
String[] titles = { " ", "C", "!", "Description", "Resource", "In Folder", "Location" };
for (int i = 0; i < titles.length; i++) {
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText(titles[i]);
}
for (int i = 0; i < 100; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, "x");
item.setText(1, "y");
item.setText(2, "!");
item.setText(3, "this stuff behaves the way I expect");
item.setText(4, "almost everywhere");
item.setText(5, "some.folder");
item.setText(6, "line " + i + " in nowhere");
}
for (int i=0; i<titles.length; i++) {
table.getColumn (i).pack ();
}
table.setSize(200, 200);
tabItem1.setControl(table);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
设置 table 大小没有帮助,因为这总是在填充后发生,因此会改变其他所有内容的大小。
我认为您需要决定 table 的 期望 高度应该是多少。例如 20 行 。然后您可以指定布局提示(以像素为单位)。如果像您的情况一样,table 的父级 GridLayout
,您可以像这样设置 table 的 GridData
:
GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true );
gridData.heightHint = 20 * table.getItemHeight();
table.setLayoutData( gridData );
如果其父项具有管理 table 的大小和位置的布局,则显式设置 table 的大小(table.setSize(200, 200)
在您的代码段中)无效。