【问题标题】:Embedded SWT Groups not filling all horizontal space嵌入式 SWT 组未填充所有水平空间
【发布时间】:2021-02-25 11:27:06
【问题描述】:

我有一个包含两个嵌入式组的 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);
                }
            }
        }

    }

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

【问题讨论】:

  • 可能您需要使用GridData.exclude,但由于您没有提供合适的minimal reproducible example 进行测试,我无法确定
  • 我添加了更多代码以使其更具重现性。
  • 如果您更改某项的 exclude 值或更改 GridData,您必须在父 Composite 上调用 layout(true) 以使其生效
  • 我添加了它,但仍然没有任何变化。
  • 该代码无法编译。

标签: java swt


【解决方案1】:

我认为这是你想要的:

 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);
      }

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

【讨论】:

  • 感谢您的调查!这解决了其中一张表的问题,但没有解决另一张表的问题,我一直以此为基础尝试。
  • 问题是,我必须为两个组的 GridLayouts 指定列数,因为我在它们上方有按钮,为了简洁起见,我没有在此处包括。
  • 为组设置列没有区别。您不希望 uIWrapperGroup 上的列,因为这会强制在右侧留出空间。我已经更新了上面的代码示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多