Java SWT-更改列宽而不更改表格宽度

Java SWT-更改列宽而不更改表格宽度,java,swt,Java,Swt,我正在使用网格布局 在设计外观时,我有一个SWT表,在输入数据之前,它应该非常适合(美学上) 为了显示数据,我必须对每一列进行打包() 无法解决我的问题您可以使用GridData.widthHint和GridData.heightHint强制设置表的特定宽度/高度。这样,如果其内容发生变化,则其大小不会增加/减少: public static void main(String[] args) { final Display display = new Display(); fin

我正在使用网格布局

在设计外观时,我有一个SWT表,在输入数据之前,它应该非常适合(美学上)

为了显示数据,我必须对每一列进行打包()


无法解决我的问题

您可以使用
GridData.widthHint
GridData.heightHint
强制设置
表的特定宽度/高度。这样,如果其内容发生变化,则其大小不会增加/减少:

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(1, false));

    final Table table = new Table(shell, SWT.V_SCROLL | SWT.H_SCROLL);
    table.setHeaderVisible(true);

    final GridData data = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
    data.widthHint = 200;
    data.heightHint = 200;
    table.setLayoutData(data);

    for(int i = 0; i < 5; i++)
    {
        TableColumn col = new TableColumn(table, SWT.NONE);
        col.setText("C" + i);
        col.pack();
    }

    Button button = new Button(shell, SWT.PUSH);
    button.setText("Fill table");
    button.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            for(int i = 0; i < 100; i++)
            {
                TableItem item = new TableItem(table, SWT.NONE);

                for(int j = 0; j < table.getColumnCount(); j++)
                {
                    item.setText(j, "Item " + i + "," + j);
                }
            }

            for(int j = 0; j < table.getColumnCount(); j++)
            {
                table.getColumn(j).pack();
            }
        }
    });

    shell.pack();
    shell.setSize(400, 300);
    shell.open();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
    display.dispose();
}
publicstaticvoidmain(字符串[]args)
{
最终显示=新显示();
最终外壳=新外壳(显示);
shell.setText(“StackOverflow”);
shell.setLayout(新的GridLayout(1,false));
最终表格=新表格(shell,SWT.V_卷轴| SWT.H_卷轴);
表.setheadervible(true);
最终GridData数据=新的GridData(SWT.beging、SWT.beging、false、false);
data.widthHint=200;
data.heightHint=200;
表.setLayoutData(数据);
对于(int i=0;i<5;i++)
{
TableColumn col=新的TableColumn(表,SWT.NONE);
塞特克斯上校(“C”+i);
col.pack();
}
按钮=新按钮(外壳,SWT.PUSH);
按钮.setText(“填充表”);
addListener(SWT.Selection,newlistener())
{
@凌驾
公共无效handleEvent(事件arg0)
{
对于(int i=0;i<100;i++)
{
TableItem项目=新的TableItem(表,SWT.NONE);
对于(int j=0;j
在添加数据之前:

添加数据后:



请记住,在组件上强制使用某些尺寸不是一种好的做法。在您的情况下,如果
外壳本身固定为某个大小,我想这样做是可以的。

第一次使用提示。。。工作得很好!不过,老实说,我没有固定的桌子尺寸(它是自动设置的),我想是时候设置一个了。非常感谢。
new Table(myShell, SWT.V_SCROLL | SWT.H_SCROLL)
public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(1, false));

    final Table table = new Table(shell, SWT.V_SCROLL | SWT.H_SCROLL);
    table.setHeaderVisible(true);

    final GridData data = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
    data.widthHint = 200;
    data.heightHint = 200;
    table.setLayoutData(data);

    for(int i = 0; i < 5; i++)
    {
        TableColumn col = new TableColumn(table, SWT.NONE);
        col.setText("C" + i);
        col.pack();
    }

    Button button = new Button(shell, SWT.PUSH);
    button.setText("Fill table");
    button.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            for(int i = 0; i < 100; i++)
            {
                TableItem item = new TableItem(table, SWT.NONE);

                for(int j = 0; j < table.getColumnCount(); j++)
                {
                    item.setText(j, "Item " + i + "," + j);
                }
            }

            for(int j = 0; j < table.getColumnCount(); j++)
            {
                table.getColumn(j).pack();
            }
        }
    });

    shell.pack();
    shell.setSize(400, 300);
    shell.open();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
    display.dispose();
}