java - 嵌入式 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);
}
}
}
}
一切正常,除了两个嵌入式组不会水平填充可用空间,而是最终朝向左侧,并在右侧可用空间结束之前停止。当只有一个嵌入组时,它会按照我想要的方式填充整个空间。我能查到什么?
解决方案
我认为这可以满足您的要求:
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
推荐阅读
- postgresql - 在 Google Cloud Postgres 上启用逻辑复制
- scala - 如何在注释宏中操作修饰符
- angular - 发送带有角度和离子框架的附加可观察对象的get
- javascript - TINYMCE 编辑器外部模板:未捕获的类型错误:无法读取未定义的属性“indexOf”
- python-3.7 - 如何使用 python 3.7 在 csv 文件中读写?
- tcp - netcat 和 scp 在身份验证、保密性和性能方面谁更好?如何
- postgresql - 为什么我的 import.sql 文件没有自动运行?
- react-native - 来自 infura 测试网的错误在 react-native 应用程序中为空
- ruby - 一种 Ruby 分支方式,允许不同用户的输入选项检查存储在数组中的所有可能的有效答案
- reactjs - 如何测试组件内函数的行为?