SWT布局选择

时间:2012-01-21 00:32:38

标签: layout swt

我正在尝试创建一个允许您选择某些变量的框,并重新排序所选的变量。因此LEFT框开始填充,右框开始为空。您可以从左向右移动项目,在右侧可以重新排列顺序(使用向上和向下按钮)。这使您可以选择所需的项目和顺序(在程序的其他部分中进行排序)。

我想要的布局看起来像这样:

enter image description here

不幸的是,它出现了......好吧......: - (

enter image description here

我正在寻找所有可行的功能。好极了。我只是在布局上遇到了很多困难。我想如果我能达到以下四个主要目标,我就会被设定。

  1. 如何在底部而不是在multis上方获得OK和CANCEL按钮?
  2. 如何让multis具有预先设定的尺寸(比方说... 10)
  3. 如何让箭头按钮垂直堆叠而不是水平堆叠?
  4. 如何让箭头按钮位于两个multis之间?
  5. 我认为这些特定目标中的每一个都可能是单线,也许是这里和那里的一点点管道......

    另一方面,我正在使用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;
    }
    

1 个答案:

答案 0 :(得分:1)

  1. 我建议您简单使用Dialog的默认确定和取消按钮,而不是尝试布置自己的。 SWT有一个很好的系统,可以将它们放在系统默认位置(例如,在Mac OS上,OK按钮将在右侧,这是正确的位置。)

  2. 请勿使用Dialog.createButton()创建按钮。这会在对话框上创建一个按钮,虽然它听起来像你想要做的,但事实并非如此。这将创建一个OK或Cancel按钮样式的按钮,预计将放置在Dialog类所拥有的按钮栏复合中,并为底行OK / Cancel按钮设置相应的样式。您想在要创建的合成中创建一个新Button。那就是:

  3.     Button addButton = new Button(dialogcomp, SWT.PUSH);
        addButton.setText(">");
        addButton.addSelectionListener(...);
    
    1. 要垂直堆叠按钮,请在dialogcomp内创建一个新的合成要包含它们。

    2. 要将箭头按钮放在List之间,您需要确保以正确的顺序添加内容。使用GridLayout,您需要按照希望它们显示的顺序添加小部件。

    3. 其他要点:

      1. 请勿通过调用Shell.setText()来更改对话框的标题。在

      2. 中致电setText()
      3. 请勿尝试在父shell中为您的List提供父级。你会得到一个复合材料来放置东西。这将对你的布局造成严重破坏。你基本上将小部件吊装到你不拥有的东西上,而不是布局。相反,请将其放入您创建的Composite

      4. 您可能还希望创建类型为SWT.ARROW | SWT.LEFT的按钮,而不是简单地绘制<符号。它可能更具视觉吸引力。只需要调查一下。

      5. 对代码进行简单的重新排列,正确创建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调整大小时水平和垂直地抓取并填充布局。但我会将其作为读者的练习。