我正在尝试创建一个允许您选择某些变量的框,并重新排序所选的变量。因此LEFT框开始填充,右框开始为空。您可以从左向右移动项目,在右侧可以重新排列顺序(使用向上和向下按钮)。这使您可以选择所需的项目和顺序(在程序的其他部分中进行排序)。
我想要的布局看起来像这样:
不幸的是,它出现了......好吧......: - (
我正在寻找所有可行的功能。好极了。我只是在布局上遇到了很多困难。我想如果我能达到以下四个主要目标,我就会被设定。
我认为这些特定目标中的每一个都可能是单线,也许是这里和那里的一点点管道......
另一方面,我正在使用GridLayout - 这可能是一个糟糕的选择。这样的事情有更好的选择吗?
没有进一步的麻烦,这里的代码会产生这种可怕的混乱......
@Override
protected Control createDialogArea(Composite parent) {
parent.getShell().setText("Multi-sort");
Composite dialogcomp = new Composite(parent, SWT.NONE);
dialogcomp.setLayout(new GridLayout(3, false));
available = new List(getShell(), SWT.BORDER | SWT.V_SCROLL);
for(String t : MultiSortDialog.availableNames) {
available.add(t);
}
used = new List(getShell(), SWT.BORDER | SWT.V_SCROLL);
for(String t : MultiSortDialog.usedNames) {
used.add(t);
}
createButton(parent, ADD, ">", false);
createButton(parent, REM, "<", false);
createButton(parent, UP, "^", false);
createButton(parent, DOWN, "V", false);
return dialogcomp;
}
答案 0 :(得分:1)
我建议您简单使用Dialog
的默认确定和取消按钮,而不是尝试布置自己的。 SWT有一个很好的系统,可以将它们放在系统默认位置(例如,在Mac OS上,OK按钮将在右侧,这是正确的位置。)
请勿使用Dialog.createButton()
创建按钮。这会在对话框上创建一个按钮,虽然它听起来像你想要做的,但事实并非如此。这将创建一个OK或Cancel按钮样式的按钮,预计将放置在Dialog
类所拥有的按钮栏复合中,并为底行OK / Cancel按钮设置相应的样式。您想在要创建的合成中创建一个新Button。那就是:
Button addButton = new Button(dialogcomp, SWT.PUSH);
addButton.setText(">");
addButton.addSelectionListener(...);
要垂直堆叠按钮,请在dialogcomp
内创建一个新的合成要包含它们。
要将箭头按钮放在List
之间,您需要确保以正确的顺序添加内容。使用GridLayout
,您需要按照希望它们显示的顺序添加小部件。
其他要点:
请勿通过调用Shell.setText()
来更改对话框的标题。在
setText()
请勿尝试在父shell中为您的List
提供父级。你会得到一个复合材料来放置东西。这将对你的布局造成严重破坏。你基本上将小部件吊装到你不拥有的东西上,而不是布局。相反,请将其放入您创建的Composite
。
您可能还希望创建类型为SWT.ARROW | SWT.LEFT
的按钮,而不是简单地绘制<
符号。它可能更具视觉吸引力。只需要调查一下。
对代码进行简单的重新排列,正确创建Button
,并创建一个新的复合来保存按钮,可以让您更接近:
Composite dialogcomp = new Composite(parent, SWT.NONE);
dialogcomp.setLayout(new GridLayout(3, false));
available = new List(dialogcomp, SWT.BORDER | SWT.V_SCROLL);
for(String t : MultiSortDialog.availableNames) {
available.add(t);
}
Composite buttonComposite = new Composite(dialogcomp, SWT.NONE);
buttonComposite.setLayout(new GridLayout(1, false));
Button addButton = new Button(buttonComposite, SWT.PUSH);
addButton.setText(">");
Button removeButton = new Button(buttonComposite, SWT.PUSH);
removeButton.setText("<");
Button upButton = new Button(buttonComposite, SWT.PUSH);
upButton.setText("^");
Button downButton = new Button(buttonComposite, SWT.PUSH);
downButton.setText("v");
used = new List(dialogcomp, SWT.BORDER | SWT.V_SCROLL);
for(String t : MultiSortDialog.usedNames) {
used.add(t);
}
这可能会让你非常接近你想要的东西。但是,您可能希望为每个实例应用GridData
。例如,您的两个List
可能希望在Dialog
调整大小时水平和垂直地抓取并填充布局。但我会将其作为读者的练习。