Выбор макета SWT - PullRequest
       25

Выбор макета SWT

1 голос
/ 21 января 2012

Я пытаюсь создать поле, позволяющее выбрать некоторые переменные и изменить порядок выбранных. Таким образом, поле LEFT начинает заполняться, поле RIGHT начинает пустым. Вы перемещаете элементы слева направо, а справа вы можете переупорядочить их порядок (с помощью кнопок вверх и вниз). Это позволяет вам выбирать, какие элементы вы хотите и в каком порядке (для целей сортировки в другом разделе программы).

Макет, на который я иду, выглядит примерно так:

enter image description here

К сожалению, это выходит как ... хорошо ...: - (

enter image description here

Функциональность, я ищу все работы. Ура. Мне просто очень тяжело с макетом. Я думаю, что если я смогу достичь следующих четырех основных целей, я буду поставлен.

  1. Как получить кнопки «ОК» и «ОТМЕНА» внизу, а не над мультисистемой?
  2. Как я могу заставить мультисайт иметь заранее установленный размер (скажем ... 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;
}

1 Ответ

1 голос
/ 21 января 2012
  1. Я бы посоветовал вам просто использовать стандартные кнопки OK и Cancel * по умолчанию Dialog и не пытаться выкладывать свои собственные. SWT имеет удобную систему для размещения их в системном расположении по умолчанию (то есть в Mac OS кнопка справа будет справа, что является правильным местоположением).

  2. Не используйте Dialog.createButton() для создания кнопок. Это создает кнопку в вашем диалоге, которая, хотя и звучит так, как будто вы хотите сделать, на самом деле это не так. Это создает кнопку в стиле кнопок OK или Отмена, которая, как ожидается, будет помещена в состав панели кнопок, которой владеет класс Dialog, и стилизована соответствующим образом для кнопок OK / Отмена в нижнем ряду. Вы хотите создать новую кнопку в композите, который вы создаете. То есть:

    Button addButton = new Button(dialogcomp, SWT.PUSH);
    addButton.setText(">");
    addButton.addSelectionListener(...);
  1. Чтобы расположить кнопки по вертикали, создайте новый композит внутри dialogcomp, который будет содержать их.

  2. Чтобы расположить кнопки со стрелками между List s, необходимо убедиться, что вы добавляете вещи в правильном порядке. С GridLayout вам нужно добавить виджеты в том порядке, в котором вы хотите, чтобы они отображались.

Другие баллы:

  1. Не меняйте заголовок диалога, вызывая Shell.setText(). Звоните setText() в своем

  2. Не пытайтесь использовать родительские элементы List в родительской оболочке. Вам дают композит, чтобы положить вещи. Это нанесет ущерб вашим макетам. Вы в основном поднимаете виджеты в вещи, которые вам не принадлежат и не размечаются. Вместо этого поместите его в Composite, который вы создали.

  3. Вы также можете создать кнопки типа 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 s для каждого из ваших экземпляров. Например, ваши два List, вероятно, захотят захватить и заполнить по горизонтали и вертикали, чтобы заполнить макет при изменении размера Dialog. Но я оставлю это как упражнение для читателя.

...