java - ScrolledComposite 中的 SWT GridLayout 弄乱了组件的大小

标签 java swt

我有一个窗口,它必须显示一个按钮列表,所有按钮都在彼此下面。 所有按钮都必须是特定大小的正方形(大小可以在运行时更改)。

这个简单示例的工作原理是显示所有按钮。

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

        val scrollPanel = new ScrolledComposite(shell, SWT.V_SCROLL);
        scrollPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        scrollPanel.setLayout(new FillLayout());

        val gridPanel = new Composite(scrollPanel, SWT.NONE);
        val gridLayout = new GridLayout(1, false);
        gridPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        gridPanel.setLayout(gridLayout);
        scrollPanel.setContent(gridPanel);

        val blue = display.getSystemColor(SWT.COLOR_BLUE);
        val red = display.getSystemColor(SWT.COLOR_RED);
        scrollPanel.setBackground(blue);
        gridPanel.setBackground(red);

        val exitButton = new Button(gridPanel, SWT.PUSH);
        exitButton.setText("Exit");
        exitButton.addListener(SWT.Selection, touchEvent -> shell.dispose());

        for (int i = 1; i <= 10; i++)
        {
            val button = new Button(gridPanel, SWT.PUSH);
            button.setText("Item: " + i);
            button.setSize(60, 60);
            gridPanel.setSize(gridPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        }

        shell.setSize(100, 700);

        shell.open();
        while (!shell.isDisposed())
            if (!display.readAndDispatch())
                display.sleep();
        display.dispose();
    }
}

但是,每当我执行 gridPanel.computeSize() 时,按钮都会失去由 button.setSize() 设置的大小。

当我在添加按钮后删除 gridPanel.setSize() 时,大小将为 0 并且 gridPanel 根本不会显示。

当我在 scrollPanel 上设置 gridLayout 并向其添加按钮时,只显示一个按钮。 (最后一个按钮,如果我使用 setContent() 和第二个(无论出于何种原因),如果我不使用 setContent() 并且只依赖于按钮的构造函数。)

此时此刻,我完全没有选择,所以如果有人能解决这个问题,那么请继续。

最佳答案

如果您使用布局(您应该使用),则不得使用 setSize() 或以其他方式干扰布局。

使用 GridDatawidthHintheightHint 来控制按钮的大小。

例如:

GridData gridData = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
gridData.widthHint = 60;
gridData.heightHint = 60;
button.setLayoutData( gridData );

关于java - ScrolledComposite 中的 SWT GridLayout 弄乱了组件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46257272/

相关文章:

java - TreeViewer 中的同一个 child 、不同的 parent

java - Windows XP 上的 jface/swt 树刷新问题

java - 如何减小 SWT 中组合框的默认大小(项目的高度)?

java - 有没有一种很好的方法来抽象 GUI,以便可以使用 SWT 或 Swing?

java - 访问给定对象的值

java - 完成类(class)并从已完成类(class)到主类(class)获取 int

java - 如何将两个列表中的项目配对

java - 如何将 JLabel.getIcon() 转换为 BufferedImage

java - 如何在 TreeViewer 中的第二列中展开列

java - 检查大 int 值是否为质数,Java 中的 BigInteger 问题