【问题标题】:Resizing swt-table without forcing their scrollbars在不强制滚动条的情况下调整 swt-table 的大小
【发布时间】:2015-05-19 14:47:50
【问题描述】:

下面的代码给了我一个类似下面图片链接的结构。例如,我有一个主要组,里面有 3 个组。每个组都有一个包含 3 列且最小宽度为 200 的表。如果您调整组合的大小,表和组也会调整大小。但如果大小小于 200,则每个表格下方都会出现一个滚动条。事实上,我的意图是在表格下方看到一个滚动条。我还尝试了主组和较小组之间的 ScrolledComposite-“Layer”,但它没有用。 谁能给我一个例子,我怎样才能创建一个滚动条而不是 3 个?

谢谢!

图片:http://www.bilder-upload.eu/show.php?file=d94e50-1432047327.jpg

public class GroupTable
{
    private static Composite composite;
    private static ArrayList<Table> tablesList = new ArrayList<Table>();
    private static int              minWidth   = 100;

    public static void main(String[] args)
    {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());

        composite = new Composite(shell, SWT.BORDER);
        GridLayout layout = new GridLayout(1, false);
        layout.marginWidth = layout.marginHeight = layout.horizontalSpacing = 0;
        composite.setLayout(layout);

        // MainGroup
        Group gr = new Group(composite, SWT.NONE);
        GridLayout gLayout = new GridLayout(3, false);
        gr.setLayout(gLayout);
        GridData griddata = new GridData(SWT.FILL, SWT.FILL, true, false);
        gr.setLayoutData(griddata);
        gr.setText("Main Group");

        for (int i = 0; i < 3; i++)
        {
            createGroups(gr, layout, i);
        }

        composite.addControlListener(new ControlAdapter()
        {
            @Override
            public void controlResized(ControlEvent e)
            {
                for (Table table : tablesList)
                {
                    Point size = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
                    ScrollBar vBar = table.getVerticalBar();
                    Composite group = table.getParent();
                    Rectangle area = group.getClientArea();
                    Rectangle t1 = area;
                    Rectangle t2 = table.computeTrim(0, 0, 0, 0);
                    Point t3 = vBar.getSize();

                    int width = t1.width - t2.width - t3.x;
                    if (size.y > area.height + table.getHeaderHeight())
                    {
                        // Subtract the scrollbar width from the total column
                        // width if a vertical scrollbar will be required
                        Point vBarSize = vBar.getSize();
                        width -= vBarSize.x;
                    }

                    TableColumn[] columnse = table.getColumns();
                    int colCount = columnse.length;
                    Point oldSize = table.getSize();
                    if (oldSize.x > area.width)
                    {
                        // table is getting smaller so make the columns
                        // smaller first and then resize the table to
                        // match the client area width
                        for (TableColumn column : columnse)
                        {
                            if (width / colCount < minWidth)
                            {
                                width = minWidth * colCount;
                            }
                            column.setWidth(width / 3);
                        }
                        table.setSize(area.width, area.height);
                    }
                    else
                    {
                        // table is getting bigger so make the table
                        // bigger first and then make the columns wider
                        // to match the client area width
                        table.setSize(area.width, area.height);
                        for (TableColumn column : columnse)
                        {
                            if (width / colCount < minWidth)
                            {
                                width = minWidth * colCount;
                            }
                            column.setWidth(width / 3);
                        }
                    }
                }
            }
        });

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

    private static void createGroups(Composite parentGroup, GridLayout layout, int i)
    {
        Group group = new Group(parentGroup, SWT.NONE);
        group.setLayout(layout);
        GridData griddata1 = new GridData(SWT.FILL, SWT.FILL, true, true);
        group.setLayoutData(griddata1);
        group.setText("group " + i);
        createTables(group, i);
    }

    private static void createTables(Group parent, int tn)
    {
        Table table = new Table(parent, SWT.FULL_SELECTION);
        tablesList.add(table);
        TableViewer localTableViewer = new TableViewer(table);
        localTableViewer.getControl().setLayoutData(
                new GridData(SWT.FILL, SWT.FILL, true, true));

        for (int j = 0; j < 3; j++)
        {
            TableViewerColumn column = new TableViewerColumn(localTableViewer,
                    SWT.NONE);
            column.getColumn().setText("column " + j);
            column.getColumn().pack();
        }

        for (int i = 0; i < 10; i++)
        {
            TableItem item = new TableItem(table, SWT.NONE);
            item.setText(new String[]{"i ", "am", "table " + tn});
        }
        table.setHeaderVisible(true);
    }
}

【问题讨论】:

    标签: java eclipse swt


    【解决方案1】:

    这是一个使用ScrolledComposite的示例:

    public static void main(String[] args)
    {
        Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
    
        ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL);
        scrolledComposite.setLayout(new FillLayout());
    
        Composite content = new Composite(scrolledComposite, SWT.NONE);
        content.setLayout(new GridLayout(3, true));
    
        for(int i = 0; i < 3; i++)
        {
            Table table = new Table(content, SWT.BORDER);
            table.setHeaderVisible(true);
            table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
            for(int col = 0; col < 3; col++)
            {
                TableColumn column = new TableColumn(table, SWT.NONE);
                column.setText("Col " + col);
            }
    
            for(int row = 0; row < 10; row++)
            {
                TableItem item = new TableItem(table, SWT.NONE);
    
                for(int col = 0; col < table.getColumnCount(); col++)
                {
                    item.setText(col, "Item " + row + " " + col);
                }
            }
    
            for(int col = 0; col < table.getColumnCount(); col++)
            {
                table.getColumn(col).pack();
            }
    
    
        }
    
        scrolledComposite.setContent(content);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);
        scrolledComposite.setMinSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    
        shell.pack();
        shell.setSize(400,300);
        shell.open();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
    

    看起来像这样:

    不需要滚动条:

    一个滚动条:

    【讨论】:

    • 太棒了,这行得通!不幸的是,如果表格变大,列不会调整大小,但这没问题!也许我会找到解决方案
    • @schmusehase Thisthisthis 可能会有所帮助。
    【解决方案2】:

    所以我尝试了 Baz 和我的混合代码。结果是一个带有可调整大小列的滚动条:) 非常感谢!!

    private static ArrayList<Table> tablesList = new ArrayList<Table>();
    private static int groupCount = 3;
    private static int colsCount = 3;
    private static int itemsCount = 10;
    private static boolean firstCheck = true;
    
    public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
    
        ScrolledComposite scrolledComposite = new ScrolledComposite(shell,
                SWT.V_SCROLL | SWT.H_SCROLL);
        scrolledComposite.setLayout(new FillLayout());
        GridLayout layout = new GridLayout(1, false);
        Composite composite = new Composite(scrolledComposite, SWT.NONE);
        composite.setLayout(layout);
    
        // // MainGroup
        Group gr = new Group(composite, SWT.NONE);
        GridLayout gLayout = new GridLayout(groupCount, false);
        gr.setLayout(gLayout);
        GridData griddata = new GridData(SWT.FILL, SWT.FILL, true, false);
        gr.setLayoutData(griddata);
        gr.setText("Main Group");
    
        for (int i = 0; i < groupCount; i++) {
            createGroups(gr, layout, i);
        }
    
        scrolledComposite.setContent(composite);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);
        scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT,
                SWT.DEFAULT));
    
        shell.setSize(900, 400);
        shell.open();
    
        shell.addControlListener(new ControlAdapter() {
            @Override
            public void controlResized(ControlEvent e) {
                resizeColumns();
            }
        });
    
        if (firstCheck) {
            resizeColumns();
            firstCheck = false;
        }
    
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
    
    private static void resizeColumns() {
        for (Table table : tablesList) {
            TableColumn[] columns = table.getColumns();
            int colCount = columns.length;
            for (TableColumn column : columns) {
                column.setWidth((table.getSize().x - 5) / colCount);
            }
        }
    }
    
    private static void createGroups(Composite parentGroup, GridLayout layout,
            int i) {
        Group group = new Group(parentGroup, SWT.NONE);
        group.setLayout(layout);
        GridData griddata1 = new GridData(SWT.FILL, SWT.FILL, true, false);
        group.setLayoutData(griddata1);
        group.setText("group " + i);
        createTables(group, i);
    }
    
    private static void createTables(Group parent, int tn) {
        Table table = new Table(parent, SWT.FULL_SELECTION);
        tablesList.add(table);
        TableViewer localTableViewer = new TableViewer(table);
        localTableViewer.getControl().setLayoutData(
                new GridData(SWT.FILL, SWT.FILL, true, true));
    
        for (int j = 0; j < colsCount; j++) {
            TableViewerColumn column = new TableViewerColumn(localTableViewer,
                    SWT.NONE);
            column.getColumn().setText("column " + j);
            column.getColumn().pack();
        }
    
        for (int i = 0; i < itemsCount; i++) {
            TableItem item = new TableItem(table, SWT.NONE);
            item.setText(new String[] { "i ", "am", "table " + tn });
        }
        table.setHeaderVisible(true);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多