我想在GridLayout中设置一个包含一些小部件的组
我还希望组件的大小是固定大小(250x250),并且它上面的小部件可以容纳(在两列内均匀分布)。
但是当我设置组的大小时,它隐藏了它的小部件。
考虑一下:
public class Gui {
public static void main(String[] args) {
Gui g=new Gui();
g.run();
}
private Shell shell;
private Display display;
private ChartComposite composite;
public Gui() {
display=new Display();
shell=new Shell(display);
shell.setSize(500, 500);
Group group=new Group(shell, SWT.NONE);
group.setText("Group");
group.setSize(250,250); // this causes trouble
GridLayout group_layout=new GridLayout();
group_layout.numColumns=2;
group_layout.marginBottom=10;
group_layout.marginTop=10;
group.setLayout(group_layout);
Button b1=new Button(group, SWT.PUSH);
b1.setText("Button1");
Button b2=new Button(group, SWT.PUSH);
b2.setText("Button2");
Button b3=new Button(group, SWT.PUSH);
b3.setText("Button3");
Button b4=new Button(group, SWT.PUSH);
b4.setText("Button4");
}
public void run() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
输出:
但是现在看一下当我将呼叫重新定位到setSize()
时会发生什么:
public class Gui {
public static void main(String[] args) {
Gui g=new Gui();
g.run();
}
private Shell shell;
private Display display;
private ChartComposite composite;
public Gui() {
display=new Display();
shell=new Shell(display);
shell.setSize(500, 500);
Group group=new Group(shell, SWT.NONE);
group.setText("Group");
GridLayout group_layout=new GridLayout();
group_layout.numColumns=2;
group_layout.marginBottom=10;
group_layout.marginTop=10;
group.setLayout(group_layout);
Button b1=new Button(group, SWT.PUSH);
b1.setText("Button1");
Button b2=new Button(group, SWT.PUSH);
b2.setText("Button2");
Button b3=new Button(group, SWT.PUSH);
b3.setText("Button3");
Button b4=new Button(group, SWT.PUSH);
b4.setText("Button4");
group.setSize(250,250); // relocated
}
public void run() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
输出:
有没有人对此行为有解释?
正如我所提到的,我需要在添加小部件之前将组的大小设置为(250x250),因此它们可以适当地容纳,如果{{{}我无法完成此操作1}}隐藏我的小部件。
答案 0 :(得分:1)
通过调用复合layout()
方法来计算和应用布局。在你的第一个片段中,这从未完成。调整复合材料的大小也会触发重新布局。这就是为什么在第二个代码段中调用setSize()
会触发布局的原因。它在您的第一个代码段中不起作用,因为当您致电setSize()
时尚未设置GridLayout。
您可以在设置布局并创建所有子项后调用setSize()
,而不是推迟group.layout()
调用。
在仅使用布局而不是绝对定位的UI中,对shell.pack()
的单次调用将以递归方式触发所有布局。