Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ScrolledComposite中的SWT GridLayout弄乱了组件的大小_Java_Swt - Fatal编程技术网

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

Java ScrolledComposite中的SWT GridLayout弄乱了组件的大小,java,swt,Java,Swt,我有一个窗口,它必须显示一个按钮列表,每个按钮都在下面。 所有按钮必须是特定大小的正方形(运行时大小可能会改变) 这个简单的例子显示了所有的按钮 public class Main { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(n

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

这个简单的例子显示了所有的按钮

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();
    }
}
公共类主
{
公共静态void main(字符串[]args)
{
显示=新显示();
外壳=新外壳(显示);
setLayout(新的FillLayout());
val scrollPanel=新的ScrolledComposite(shell,SWT.V_SCROLL);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true));
scrollPanel.setLayout(新的FillLayout());
val gridPanel=新组合(scrollPanel,SWT.NONE);
val gridLayout=新的gridLayout(1,false);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true));
设置布局(gridLayout);
scrollPanel.setContent(gridPanel);
val blue=display.getSystemColor(SWT.COLOR_blue);
val red=display.getSystemColor(SWT.COLOR\u red);
滚动面板。立根背景(蓝色);
网格面板。立根背景(红色);
val exitButton=新按钮(网格面板,SWT.PUSH);
setText(“退出”);
addListener(SWT.Selection,touchEvent->shell.dispose());
对于(int i=1;i如果使用布局(您应该使用),则不得使用
setSize()
或以其他方式干扰布局

使用
GridData
widthHint
heightHint
来控制按钮的大小

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();
    }
}
例如:

GridData gridData = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
gridData.widthHint = 60;
gridData.heightHint = 60;
button.setLayoutData( gridData );
Button button = new Button(gridPanel, SWT.PUSH);
button.setText("Item: " + i);
GridData buttonLayoutData = new GridData();
buttonLayoutData.widthHint = 60;
buttonLayoutData.heightHint = 60;
button.setLayoutData(buttonLayoutData);

首先,
setSize
只有在不使用布局(绝对定位)时才能正常工作

如果您使用的是布局,它将根据布局本身以及您定义组件布局数据的方式自动设置组件大小

通常,强烈建议使用布局而不是绝对定位

GridLayout
的情况下,您可以通过
widthHint
heightHint
在其
GridData
中指定组件尺寸,例如:

GridData gridData = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
gridData.widthHint = 60;
gridData.heightHint = 60;
button.setLayoutData( gridData );
Button button = new Button(gridPanel, SWT.PUSH);
button.setText("Item: " + i);
GridData buttonLayoutData = new GridData();
buttonLayoutData.widthHint = 60;
buttonLayoutData.heightHint = 60;
button.setLayoutData(buttonLayoutData);
其他意见:

  • 要使ScrollComposite正常工作,应添加以下行:

    scrollPanel.setExpandHorizontal(true);
    scrollPanel.setExpandVertical(true);
    scrollPanel.setMinSize(gridPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    
    特别是,
    setMinSize
    将告诉
    ScrollComposite
    滚动条的显示大小

  • 如果父布局是一个
    FillLayout
    ,则不应在其子布局上设置布局数据。它不会做任何事情,因为它不是预期的。因此,您应该从
    scrollPanel
    gridPanel
    中删除
    setLayoutData

  • 如果您想在稍后更改按钮大小,只需获取其布局数据,修改提示并要求组件进行布局(也不要忘记使用
    setMinSize
    )将更改通知滚动条):


删除/替换FillLayout还是从scroll-/grid面板中删除布局数据更好?我将FillLayout放在shell和scrollPanel上,因为当时没有显示任何内容……我非常绝望:只有当父布局是
GridLayout
时才需要D
GridData
。如果您只想填充内容l所有可用空间,则
FillLayout
是最佳选择。它似乎适合您的情况。