【问题标题】:SWT layout selectionSWT 布局选择
【发布时间】:2012-01-23 00:51:48
【问题描述】:

我正在尝试制作一个框,让您可以选择一些变量,并重新排序已选择的变量。所以左框开始填充,右框开始为空。您将项目从左向右移动,在右侧您可以重新排列它们的顺序(使用向上和向下按钮)。这使您可以选择您想要的项目以及按什么顺序(用于在程序的另一部分进行排序)。

我想要的布局如下所示:

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

我正在寻找的所有功能都有效。耶。我只是很难与布局。我想如果我能达到以下四个主要目标,我就会确定。

  1. 我怎样才能在底部而不是在 multis 上方获得 OK 和 CANCEL 按钮?
  2. 我怎样才能让 multis 具有预设的尺寸(比如说... 10)
  3. 如何让箭头按钮垂直而不是水平堆叠?
  4. 如何让箭头按钮位于两个多重按钮之间?

我认为这些特定目标中的每一个都可能是单行的,也许在这里和那里有点管道......

顺便说一句,我正在使用 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;
}

【问题讨论】:

    标签: layout swt


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

    2. 不要使用Dialog.createButton() 创建按钮。这会在您的对话框上创建一个按钮,虽然这听起来像是您想要做的,但实际上并非如此。这将创建一个 OK 或 Cancel 按钮样式的按钮,预计将放置在 Dialog 类拥有的按钮栏组合中,并为底行的 OK/Cancel 按钮设置适当的样式。您想在您正在创建的复合材料中创建一个新按钮。那就是:

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

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

    其他要点:

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

    2. 中致电setText()
    3. 不要试图在父 shell 中设置你的 Lists。你得到了一个复合材料来放东西。这会对你的布局造成严重破坏。您基本上是将小部件提升到您不拥有且不布局的东西中。而是将其放在您创建的Composite 中。

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

    对代码进行简单的重新排列,正确创建Buttons,并创建一个新的组合来保存按钮,会让你更接近:

    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);
    }
    

    这可能会让你非常接近你想要的。但是,您可能希望为每个实例应用GridDatas。例如,您的两个Lists 可能希望在调整Dialog 大小时水平和垂直地抓取和填充以填充布局。但我会把它留给读者作为练习。

    【讨论】:

    • 读者练习对我来说很好。这正是我正在寻找的,即使没有你的代码!简单的点使它成为一个很好的答案。代码 sn-p 只是锦上添花。太感谢了!我一定会让你知道事情的结果。 :-)
    • 周末工作真好。这是一个巨大的帮助。一些注意事项 - 我使用 dialogcomp 作为used 的父级而不是 getShell(),并修复了删除按钮的文本(必须翻转)。我添加了选择侦听器,它们刚刚调用了我已经编写好的工作和测试方法来了解它们的行为。我仍然需要添加默认的“确定”和“取消”按钮(我以前使用过,但从未真正打开它们......),但除此之外,它就像一个魅力。非常感谢您花时间解释思考过程 - 它比代码价值 10 倍!
    • 我没有看到的是目标 #2。我找不到一种方法来轻松地说“让这两个列表都对 10 行可见”。有什么想法吗?
    • 很好地了解removeButton 的文本和used 的父级。至于高度提示,您可以设置GridDataheightHint,以像素为单位。如果您想估计字符高度,您必须构建一个GC 并测量List 字体的字符串范围,然后乘以您想要的行数。它并不完美(它没有考虑您的操作系统添加的任何边距/填充),但它非常接近并且是一种方便的实用方法。
    • 爱德华,这确实是完美的。我只是把它做得有点太大了,小心谨慎,看起来还不错。即使他们必须滚动,关键是左右是相同的大小。这是非常重要的。我非常感谢您提供的帮助。它不仅解决了我在这里遇到的问题,而且还帮助我理解了创建这些布局所需的心态。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多