【问题标题】:SWT removing margin from CompositeSWT 从 Composite 中删除边距
【发布时间】:2023-04-05 13:57:02
【问题描述】:

当我在ViewPart 中嵌入Composite 控件时,会在文本框和按钮之间添加垂直边距/填充(按钮是另一个组合的一部分),如附图所示。

我怎样才能删除它?

public class View extends ViewPart {
    public static final String ID = "xyyx.view";

    public void createPartControl(Composite parent) {

        GridLayout layout = new GridLayout(1, false);
        parent.setLayout(layout);


        Text infoText = new Text(parent, SWT.BORDER);

        GridData gridDataInfo = new GridData();
        gridDataInfo.horizontalSpan = 1;
        gridDataInfo.grabExcessHorizontalSpace = true;
        gridDataInfo.horizontalAlignment = GridData.FILL;
        infoText.setLayoutData(gridDataInfo);       

        new NewComposite(parent, SWT.NONE);         

    }

    public class NewComposite extends Composite{

        public NewComposite(Composite parent, int style) {
            super(parent, style);           

            GridLayout layout = new GridLayout(1, false);
            setLayout(layout);      

            Button btn = new Button(parent, SWT.PUSH);
            btn.setText("Button");                  
        }

    }

    @Override
    public void setFocus() {
        // TODO Auto-generated method stub

    }

}

【问题讨论】:

    标签: java layout swt


    【解决方案1】:

    GridLayout#marginHeightGridLayout#marginWidth 可以设置为 0 以删除边距。

    在您的情况下,设置NewCompositeGridLayout#marginTop 可能就足够了。

    JavaDoc of GridLayout#marginHeight

    像这样:

    public static void main(String[] args)
    {
        Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));
    
        Composite first = new Composite(shell, SWT.NONE);
        Composite second = new Composite(shell, SWT.NONE);
    
        GridLayout firstLayout = new GridLayout(1, false);
        first.setLayout(firstLayout);
    
        GridLayout secondLayout = new GridLayout(1, false);
        secondLayout.marginHeight = 0;
        secondLayout.marginWidth = 0;
        second.setLayout(secondLayout);
    
        Button firstButton = new Button(first, SWT.PUSH);
        firstButton.setText("Margin");
        Button secondButton = new Button(second, SWT.PUSH);
        secondButton.setText("No Margin");
    
        first.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        second.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        firstButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        secondButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
        shell.pack();
        shell.open();
    
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
    
        display.dispose();
    }
    

    看起来像这样:

    如果您想进一步缩小组合之间的间距,您也可以将GridLayout#verticalSpacing 设置为0

    GridLayout layout = new GridLayout(1, false);
    layout.verticalSpacing = 0;
    shell.setLayout(layout);
    

    看起来像这样:

    【讨论】:

    • 在 NewComposite 中设置 layout.marginHeight = 0; layout.marginTop = 0; 没有帮助
    • 在我的示例中不起作用,即使在您的示例中,两个按钮之间也存在间隙
    • @Tirmean 是的,因为第一个按钮还有边距
    • 在我的例子中,layout.verticalSpacing = 0;解决了问题! 10x
    【解决方案2】:

    GridLayout#horizo​​ntalSpacingGridLayout#verticalSpacing 可以设置为 0 以去除列和行之间的间距。

    在您的情况下,设置父复合的 GridLayout#verticalSpacing 应该可以解决问题。

    【讨论】: