首页 > 解决方案 > 嵌入式 SWT 组未填充所有水平空间

问题描述

我有一个 SWT 组,它有两个嵌入式组。一次只能看到其中一个,我们可以通过按钮在它们之间切换。问题是,当它们可见时,我希望它们都填满整个空间,但它们没有这样做。

package guitables;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;

public class GuiTables {

    private static Group uIWrapperGroup;
    private static Group uGroup;
    private static Group iPGroup;
    private static ExpandBar expandBar;
    private static ExpandItem expandItem;
    private static Button switchToUButton;
    private static Button switchToIButton;
    
    public static void main(String[] args) {
        Display display = new Display();
        final Shell shell = new Shell(display);
        create(shell);
    }
     
     private static void create(final Shell shell) {
        expandBar = new ExpandBar(shell, SWT.NONE);
        expandItem = new ExpandItem(expandBar, SWT.NONE);
        expandItem.setExpanded(true);
        uIWrapperGroup = new Group(shell, SWT.VERTICAL);
        uIWrapperGroup.setText("");
        uIWrapperGroup.setLayout(new GridLayout(21, false));
        uIWrapperGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        uGroup = new Group(uIWrapperGroup, SWT.NONE);
        uGroup.setText("");
        uGroup.setLayout(new GridLayout(21, false));
        
        createUButtons(uGroup);

        iPGroup = new Group(uIWrapperGroup, SWT.NONE);
        iPGroup.setText("");
        iPGroup.setLayout(new GridLayout(21, false));
        iPGroup.setVisible(false);
        
        createIPButtons(iPGroup);
    }

        private static void createUButtons(Composite parent) {
            switchToIButton = new Button(parent, SWT.NONE);;
            switchToIButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    switchToIP();
                }

            });
        }
        
        private static void createIPButtons(Composite parent) {
            switchToUButton = new Button(parent, SWT.NONE);
            switchToUButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    switchToU();
                }
            });
        }

        private static void switchToIP() {
            uGroup.setVisible(false);
            GridData invisible = new GridData(0,0);
            invisible.exclude = true;
            uGroup.setLayoutData(invisible);
            uGroup.setVisible(false);
            GridData visible = new GridData(SWT.FILL, SWT.FILL, true, true);
            visible.exclude=false;
            iPGroup.setLayoutData(visible);
            iPGroup.setVisible(true);
            reLayoutExpandItem(expandItem, uIWrapperGroup, SWT.DEFAULT);
        }
        
        private static void switchToU() {
            iPGroup.setVisible(false);
            GridData invisible = new GridData(0,0);
            invisible.exclude = true;
            iPGroup.setLayoutData(invisible);
            iPGroup.setVisible(false);
            GridData visible = new GridData(SWT.FILL, SWT.FILL, true, true);
            visible.exclude=false;
            uGroup.setLayoutData(visible);
            uGroup.setVisible(true);
            reLayoutExpandItem(expandItem, uIWrapperGroup, SWT.DEFAULT);
        }

        public static void reLayoutExpandItem(ExpandItem expandItem, Composite composite, int maxHeight) {
            if (!composite.isDisposed()) {
                int height = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
                if(SWT.DEFAULT != maxHeight && height > maxHeight) {
                    expandItem.setHeight(maxHeight);
                } else {
                    expandItem.setHeight(height);
                }
            }
        }

    }

一切正常,除了两个嵌入式组不会水平填充可用空间,而是最终朝向左侧,并在右侧可用空间结束之前停止。当只有一个嵌入组时,它会按照我想要的方式填充整个空间。我能查到什么?

标签: javaswt

解决方案


我认为这可以满足您的要求:

 void create(final Composite parent) {
      expandBar = new ExpandBar(parent, SWT.NONE);
      expandItem = new ExpandItem(expandBar, SWT.NONE);
      expandItem.setExpanded(true);

      uIWrapperGroup = new Group(parent, SWT.VERTICAL);
      uIWrapperGroup.setText("Wrapper Group");
      uIWrapperGroup.setLayout(new GridLayout());
      uIWrapperGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

      uGroup = new Group(uIWrapperGroup, SWT.NONE);
      uGroup.setText("U Group");

      uGroup.setLayout(new GridLayout(21, false));

      uGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); 

      createUButtons(uGroup);

      iPGroup = new Group(uIWrapperGroup, SWT.NONE);
      iPGroup.setText("I Group");

      iPGroup.setLayout(new GridLayout(21, false));

      iPGroup.setVisible(false);

      iPGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); 
      ((GridData)iPGroup.getLayoutData()).exclude = true;

      createIPButtons(iPGroup);
   }

     private void switchToIP() {
          uGroup.setVisible(false);
          ((GridData)uGroup.getLayoutData()).exclude = true;

          iPGroup.setVisible(true);
          ((GridData)iPGroup.getLayoutData()).exclude = false;

          uIWrapperGroup.layout(true);

          reLayoutExpandItem(expandItem, uIWrapperGroup, SWT.DEFAULT);
      }

      private void switchToU() {
        uGroup.setVisible(true);
        ((GridData)uGroup.getLayoutData()).exclude = false;

        iPGroup.setVisible(false);
        ((GridData)iPGroup.getLayoutData()).exclude = true;

        uIWrapperGroup.layout(true);

        reLayoutExpandItem(expandItem, uIWrapperGroup, SWT.DEFAULT);
      }

GridData当使用正确的设置创建组时,这将设置在组上exclude。switch 方法修改现有的 GridData


推荐阅读