使用 GridLayout 居中确定和取消按钮
Center ok and cancel button with GridLayout
我用一些组件构建了自己的查找对话框来配置搜索,我想使用 GridLayout 布置控件。
但我无法放置确定和取消按钮。我想将这些按钮居中,以便 window 的左边缘和确定按钮之间的边距、确定按钮和取消按钮之间的边距以及取消按钮和 [ 的右边缘之间的边距=36=]也是一样。
这是我当前的代码:
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
GridLayout gridLayout = new GridLayout();
gridLayout.horizontalSpacing = 0;
gridLayout.makeColumnsEqualWidth = true;
gridLayout.marginHeight = 10;
gridLayout.marginWidth = 10;
gridLayout.numColumns = 5;
gridLayout.verticalSpacing = 10;
shell.setLayout(gridLayout);
shell.setText("Find");
GridData gridData = new GridData();
gridData.horizontalSpan = 5;
Label label1 = new Label(shell, SWT.NONE);
label1.setLayoutData(gridData);
label1.setText("Please enter the find text in the field below:");
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 5;
Text text1 = new Text(shell, SWT.BORDER | SWT.H_SCROLL | SWT.SINGLE);
text1.setLayoutData(gridData);
gridData = new GridData();
gridData.horizontalSpan = 5;
Button check1 = new Button(shell, SWT.CHECK);
check1.setLayoutData(gridData);
check1.setText("Match case sensitivity");
new Label(shell, SWT.NONE);
Button okButton = new Button(shell, SWT.PUSH);
okButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
okButton.setText("&OK");
shell.setDefaultButton(okButton);
new Label(shell, SWT.NONE);
Button cancelButton = new Button(shell, SWT.PUSH);
cancelButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
cancelButton.setText("&Cancel");
new Label(shell, SWT.NONE);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
我的问题是取消按钮似乎居中,但确定按钮仍然在左侧对齐。
我想要的是一个位置,例如:左边缘,50 像素,确定按钮,50 像素,取消按钮,50 像素,右边缘。
它应该是这样的:
+++ 已编辑 +++
好的,我找到了解决办法。它并不完美,但它以令人满意的方式符合我的要求:
我现在使用两种复合材料 - 一种用于 "main" 控件,一种用于按钮。
我将一个 GridLayout 与一个 cloumn 放在 window 上,以将复合材料放在彼此之间。
按钮组合也有一个 GridLayout,但有两列用于确定和取消。然后我可以使用 GridData 对象将 window 中的按钮居中。
我唯一的问题是按钮之间的水平间距。我不得不将它设置为一个绝对值,但最好设置一个动态值(可能取决于 window 的整个宽度)。但是我还没有意识到这一点。
这是我构建的:
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
shell.setText("Find");
Composite mainComp = new Composite(shell, SWT.NONE);
mainComp.setLayout(new GridLayout(1, false));
mainComp.setLayoutData(new GridData());
Label label1 = new Label(mainComp, SWT.NONE);
label1.setLayoutData(new GridData());
label1.setText("Please enter the find text in the field below:");
Text text1 = new Text(mainComp, SWT.BORDER | SWT.H_SCROLL | SWT.SINGLE);
text1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button check1 = new Button(mainComp, SWT.CHECK);
check1.setLayoutData(new GridData());
check1.setText("Match case sensitivity");
Composite buttonComp = new Composite(shell, SWT.NONE);
GridLayout buttonCompLayout = new GridLayout();
buttonCompLayout.horizontalSpacing = 50;
buttonCompLayout.numColumns = 2;
buttonComp.setLayout(buttonCompLayout);
buttonComp.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
Button okButton = new Button(buttonComp, SWT.PUSH);
okButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
okButton.setText("&OK");
shell.setDefaultButton(okButton);
Button cancelButton = new Button(buttonComp, SWT.PUSH);
cancelButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
cancelButton.setText("&Cancel");
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
如果你想根据 window 的宽度设置间距,你可以听 SWT.Resize
然后更新 GridLayout#horizontalSpacing
。然后,在父级上调用 layout()
。
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new GridLayout());
shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Composite comp = new Composite(shell, SWT.BORDER);
final GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 50;
comp.setLayout(layout);
comp.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
Button first = new Button(comp, SWT.PUSH);
first.setText("First");
first.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
Button second = new Button(comp, SWT.PUSH);
second.setText("Second");
second.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
shell.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event event)
{
int width = shell.getSize().x;
layout.horizontalSpacing = (int) Math.round(0.1 * width);
shell.layout(true, true);
}
});
shell.pack();
shell.open();
shell.forceFocus();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
看起来像这样:
我用一些组件构建了自己的查找对话框来配置搜索,我想使用 GridLayout 布置控件。
但我无法放置确定和取消按钮。我想将这些按钮居中,以便 window 的左边缘和确定按钮之间的边距、确定按钮和取消按钮之间的边距以及取消按钮和 [ 的右边缘之间的边距=36=]也是一样。
这是我当前的代码:
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
GridLayout gridLayout = new GridLayout();
gridLayout.horizontalSpacing = 0;
gridLayout.makeColumnsEqualWidth = true;
gridLayout.marginHeight = 10;
gridLayout.marginWidth = 10;
gridLayout.numColumns = 5;
gridLayout.verticalSpacing = 10;
shell.setLayout(gridLayout);
shell.setText("Find");
GridData gridData = new GridData();
gridData.horizontalSpan = 5;
Label label1 = new Label(shell, SWT.NONE);
label1.setLayoutData(gridData);
label1.setText("Please enter the find text in the field below:");
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 5;
Text text1 = new Text(shell, SWT.BORDER | SWT.H_SCROLL | SWT.SINGLE);
text1.setLayoutData(gridData);
gridData = new GridData();
gridData.horizontalSpan = 5;
Button check1 = new Button(shell, SWT.CHECK);
check1.setLayoutData(gridData);
check1.setText("Match case sensitivity");
new Label(shell, SWT.NONE);
Button okButton = new Button(shell, SWT.PUSH);
okButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
okButton.setText("&OK");
shell.setDefaultButton(okButton);
new Label(shell, SWT.NONE);
Button cancelButton = new Button(shell, SWT.PUSH);
cancelButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
cancelButton.setText("&Cancel");
new Label(shell, SWT.NONE);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
我的问题是取消按钮似乎居中,但确定按钮仍然在左侧对齐。
我想要的是一个位置,例如:左边缘,50 像素,确定按钮,50 像素,取消按钮,50 像素,右边缘。
它应该是这样的:
+++ 已编辑 +++
好的,我找到了解决办法。它并不完美,但它以令人满意的方式符合我的要求:
我现在使用两种复合材料 - 一种用于 "main" 控件,一种用于按钮。
我将一个 GridLayout 与一个 cloumn 放在 window 上,以将复合材料放在彼此之间。
按钮组合也有一个 GridLayout,但有两列用于确定和取消。然后我可以使用 GridData 对象将 window 中的按钮居中。
我唯一的问题是按钮之间的水平间距。我不得不将它设置为一个绝对值,但最好设置一个动态值(可能取决于 window 的整个宽度)。但是我还没有意识到这一点。
这是我构建的:
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
shell.setText("Find");
Composite mainComp = new Composite(shell, SWT.NONE);
mainComp.setLayout(new GridLayout(1, false));
mainComp.setLayoutData(new GridData());
Label label1 = new Label(mainComp, SWT.NONE);
label1.setLayoutData(new GridData());
label1.setText("Please enter the find text in the field below:");
Text text1 = new Text(mainComp, SWT.BORDER | SWT.H_SCROLL | SWT.SINGLE);
text1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button check1 = new Button(mainComp, SWT.CHECK);
check1.setLayoutData(new GridData());
check1.setText("Match case sensitivity");
Composite buttonComp = new Composite(shell, SWT.NONE);
GridLayout buttonCompLayout = new GridLayout();
buttonCompLayout.horizontalSpacing = 50;
buttonCompLayout.numColumns = 2;
buttonComp.setLayout(buttonCompLayout);
buttonComp.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
Button okButton = new Button(buttonComp, SWT.PUSH);
okButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
okButton.setText("&OK");
shell.setDefaultButton(okButton);
Button cancelButton = new Button(buttonComp, SWT.PUSH);
cancelButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
cancelButton.setText("&Cancel");
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
如果你想根据 window 的宽度设置间距,你可以听 SWT.Resize
然后更新 GridLayout#horizontalSpacing
。然后,在父级上调用 layout()
。
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Whosebug");
shell.setLayout(new GridLayout());
shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Composite comp = new Composite(shell, SWT.BORDER);
final GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 50;
comp.setLayout(layout);
comp.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
Button first = new Button(comp, SWT.PUSH);
first.setText("First");
first.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
Button second = new Button(comp, SWT.PUSH);
second.setText("Second");
second.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
shell.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event event)
{
int width = shell.getSize().x;
layout.horizontalSpacing = (int) Math.round(0.1 * width);
shell.layout(true, true);
}
});
shell.pack();
shell.open();
shell.forceFocus();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
看起来像这样: