Проблемы с макетом в FieldEditorPreferencePage - PullRequest
6 голосов
/ 29 января 2009

У меня следующие проблемы с настройками макета в FieldEditorPreferencePage.
Мой код примерно такой:

public void createFieldEditors () {
  Group pv = new group(getfieldEditorParent(), SWT.SHADOW_OUT);
  Group of = new group(getfieldEditorParent(), SWT.SHADOW_OUT);
  pv.setText(“pv”);
  of.setText(“of”);
  GridLayout layout = new GridLayout(2,false);
  pv.setLayout(layout);
  of.setLayout(layout);
  addField(new StringFieldEditor(“PreferenceStore name”,“Text:”, pv);
  addField(new StringFieldEditor(“PreferenceStore name”,“Text:”, pv);
  addField(new StringFieldEditor(“PreferenceStore name”,“Text:”, of);
  addField(new StringFieldEditor(“PreferenceStore name”,“Text:”, of);
  and so on.
 }

Проблема в том, что он не работает с GridLayout.
StringFieldEditors не являются параллельными. Количество столбцов всегда равно 1. Также, когда я пытаюсь изменить размер StringFieldEditors в группах, он тоже не работает.

У кого-нибудь есть идеи?
Спасибо.

Ответы [ 5 ]

7 голосов
/ 31 марта 2009

Проблема в том, что когда вы используете FieldEditorPreferencePage, вы можете использовать только FieldEditor подклассы в качестве компонентов. Вот фрагмент из документации:

FieldEditorPreferencePage реализует страница, которая использует эти полевые редакторы для отобразить и сохранить настройки значения на странице. Вместо создание элементов управления SWT, чтобы заполнить его содержимое, FieldEditorPreferencePage подкласс создает поля редакторов показать содержимое. Все поля на странице должны быть заполнены в качестве полевых редакторов .

Это означает, что у вас есть два варианта достижения желаемого:

  1. Реализуйте свой собственный подкласс FieldEditor, который будет представлять виджет Группы.
  2. Не расширять FieldEditorPreferencePage, а только PreferencePage. Тогда вам нужно реализовать метод createContents вместо createFieldEditors. Вам также придется управлять загрузкой и сохранением свойств.

Я думаю, что второй способ может быть проще, если вы хотите предоставить какую-то сложную компоновку. Вы можете найти более подробную информацию здесь

2 голосов
/ 20 ноября 2013

Другой (легкий) обходной путь: Вы также можете создавать новые композиты, чтобы создавать больше столбцов. Проблема в том, что эти FieldEditors взаимодействуют со своими родителями и портят ваш макет. Таким образом, создавая «пустой» композит, они могут общаться столько, сколько хотят :)

someGroup = new Group(..., SWT.NONE);
someGroup .setLayout(new GridLayout(16, false));

Composite myC1= new Composite(someGroup,SWT.NONE);
addField(new BooleanFieldEditor(...,C1);

Composite myC2= new Composite(someGroup,SWT.NONE);
addField(new BooleanFieldEditor(...,C2);
1 голос
/ 17 октября 2012

Я реализую Group-FieldEditor, который может содержать другие FieldEditor, и размечаю их как Группу.


import java.util.Collection;

import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;

/**
 * Class is intended to create a Group Widgets, inside of the {@link FieldEditorPreferencePage}
 * objects.
 * This class should be used as following:
 * <ul>
 * <li>use the {@link #getFieldEditorParent()} to as a parent, while creating new Field Editors.
 * <li>use {@link #setFieldEditors(Collection)} to add the collection of FieldEditors to the
 * {@link GroupFieldEditor}.
 * </ul>
 *
 * @author alf
 *
 */
public class GroupFieldEditor extends FieldEditor {

    private String name;
    private Collection members;
    private int numcolumns;
    private Group group;
    private Composite parent;


    /**
     * The gap outside, between the group-frame and the widgets around the group
     */
    private static final int GROUP_PADDING = 5; // px

    /**
     * The gap inside, between the group-frame and the content
     */
    private static final int GROUP_VERTICAL_MARGIN = 5; // px



    /**
     * The inside-distance creates a new boolean field editor
     */
    protected GroupFieldEditor() {
    }

    /**
     * Creates a Group of {@link FieldEditor} objects
     *
     * @param name
     *            - name
     * @param fieldEditorParent
     *            - parent
     */
    public GroupFieldEditor(String name, Composite fieldEditorParent) {
        this.name = name;

        // the parent is a Composite, which is contained inside of the preference page. Initially it
        // does not have any layout.
        this.parent = fieldEditorParent;
        FillLayout fillLayout = new FillLayout();
        fillLayout.marginHeight = GROUP_VERTICAL_MARGIN;
        this.parent.setLayout(fillLayout);

        this.group = new Group(parent, SWT.DEFAULT);
        this.group.setText(this.name);
    }

    /**
     * The parent for all the FieldEditors inside of this Group.
     *
     * @return - the parent
     */
    public Composite getFieldEditorParent() {
        return group;
    }

    /**
     * Sets the FieldeditorChildren for this {@link GroupFieldEditor}
     * 
     * @param membersParam
     */
    public void setFieldEditors(Collection membersParam) {
        this.members = membersParam;
        doFillIntoGrid(getFieldEditorParent(), numcolumns);
    }

    /*
     * (non-Javadoc) Method declared on FieldEditor.
     */
    @Override
    protected void adjustForNumColumns(int numColumns) {
        this.numcolumns = numColumns;
    }

    /*
     * (non-Javadoc) Method declared on FieldEditor.
     */
    @Override
    protected void doFillIntoGrid(Composite parentParam, int numColumns) {

        GridLayout gridLayout = new GridLayout();
        gridLayout.marginLeft = GROUP_PADDING;
        gridLayout.marginRight = GROUP_PADDING;
        gridLayout.marginTop = GROUP_PADDING;
        gridLayout.marginBottom = GROUP_PADDING;
        this.group.setLayout(gridLayout);

        this.parent.layout();
        this.parent.redraw();

        if (members != null) {
            for (FieldEditor editor : members) {
                editor.fillIntoGrid(getFieldEditorParent(), 1);
            }
        }
    }


    /*
     * (non-Javadoc) Method declared on FieldEditor. Loads the value from the
     * preference store and sets it to the check box.
     */
    @Override
    protected void doLoad() {
        if (members != null) {
            for (FieldEditor editor : members) {
                editor.load();
            }
        }
    }

    /*
     * (non-Javadoc) Method declared on FieldEditor. Loads the default value
     * from the preference store and sets it to the check box.
     */
    @Override
    protected void doLoadDefault() {
        if (members != null) {
            for (FieldEditor editor : members) {
                editor.loadDefault();
            }
        }
    }


    /*
     * (non-Javadoc) Method declared on FieldEditor.
     */
    @Override
    protected void doStore() {
        if (members != null) {
            for (FieldEditor editor : members) {
                editor.store();
            }
        }
    }

    @Override
    public void store() {
        super.store();
        doStore();
    }



    /*
     * (non-Javadoc) Method declared on FieldEditor.
     */
    @Override
    public int getNumberOfControls() {
        return 1;
    }

    /*
     * (non-Javadoc) Method declared on FieldEditor.
     */
    @Override
    public void setFocus() {
        if (members != null && !members.isEmpty()) {
            members.iterator().next().setFocus();
        }
    }


    /*
     * @see FieldEditor.setEnabled
     */
    @Override
    public void setEnabled(boolean enabled, Composite parentParam) {
        if (members != null) {
            for (FieldEditor editor : members) {
                editor.setEnabled(enabled, parentParam);
            }
        }
    }

    @Override
    public void setPreferenceStore(IPreferenceStore store) {
        super.setPreferenceStore(store);
        if (members != null) {
            for (FieldEditor editor : members) {
                editor.setPreferenceStore(store);
            }
        }
    }


}
1 голос
/ 14 ноября 2011

Две вещи, которые нужно понять о FieldEditorPreferencePage (в стиле GRID):

  1. Макет родительского редактора полей всегда устанавливается на GridLayout даже для «пользовательских» компонентов, таких как Groups;
  2. Количество столбцов в макете корректируется в соответствии с максимальным количеством компонентов в любом из редакторов полей (которое равно 2 в случае StringFieldEditor).

В приведенном выше примере данные макета Groups должны учитывать это:

GridDataFactory.defaultsFor(pv).grab(true, false).span(2, 1).applyTo(pv);
GridDataFactory.defaultsFor(of).grab(true, false).span(2, 1).applyTo(of);
0 голосов
/ 17 мая 2018

Еще один обходной путь:

Используйте метки для разделения групп полей. Следующее создает вертикальный разделитель строк и помещает текст непосредственно под ним:

new Label(getFieldEditorParent(), SWT.SEPARATOR | SWT.HORIZONTAL)
        .setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
new Label(getFieldEditorParent(), SWT.NONE).setText("My Group Title");
...