Проблемы при попытке создать org.eclipse.swt.widgets.Composite, который содержит два TableViewers - PullRequest
1 голос
/ 31 января 2011

Мне было поручено создать Composite, который содержит два TableViewer.Верхняя таблица содержит один ряд редактируемых ячеек.Эти ячейки таблицы будут использоваться для фильтрации данных в нижней таблице.Есть ряд вещей, которые не работают должным образом, но я ограничу свой вопрос здесь одним конкретным.Таблицы TableViewers выходят за пределы ширины и высоты составного элемента, в котором они содержатся, и я не могу просматривать столбцы таблицы за правым краем (или строки нижней таблицы, которые выходят под дно) составного элемента.Горизонтальная полоса прокрутки Composite прокручивается правильно, но только до ширины Composite (что неудивительно).Я уверен, что это так же просто, как настроить константы GridData или SWT во время конструирования.К сожалению, я попробовал несколько разных комбинаций без успеха.Вот фрагмент моего соответствующего кода:

public class ControlledColumnFilterTableComposite<T> extends Composite {
private TableViewer filterViewer;
private TableViewer mainViewer;
public ControlledColumnFilterTableComposite(Composite parent,
   IControlledColumnTableContentProvider<T> content) {
  super(parent, SWT.H_SCROLL);
  createComposite(parent, content);
}
private void createComposite(Composite parent,
   IControlledColumnTableContentProvider<T> content) {
  this.setLayout(new GridLayout(1, false));
  GridData data = getLayoutData(parent);
  this.setLayoutData(data);
  addHorizontalBarListener();
  this.filterViewer = createFilterViewer(parent, content);
  this.mainViewer = createMainViewer(parent, content);
}
private TableViewer createFilterViewer(Composite parent,
   IControlledColumnTableContentProvider<T> content) {
  TableViewer viewer = new TableViewer(this, SWT.MULTI
     | SWT.FULL_SELECTION | SWT.BORDER);
  viewer.getTable().setHeaderVisible(true);
  viewer.getTable().setLinesVisible(true);
  viewer.setContentProvider(content);
  ControlledColumnTableMetadata<T> metadata = content.getMetadata();
  for (int i = 0; i < metadata.getBean().getDeclaredFields().length; i++) {
   getViewerColumn(viewer, metadata.getBean().getDeclaredFields()[i],
    true);
  }
  return viewer;
}
private TableViewer createMainViewer(Composite parent,
   IControlledColumnTableContentProvider<T> content) {
  TableViewer viewer = new TableViewer(this, SWT.MULTI | SWT.V_SCROLL
   | SWT.FULL_SELECTION | SWT.BORDER);
  viewer.getTable().setHeaderVisible(false);
  viewer.getTable().setLinesVisible(true);
  viewer.setContentProvider(content);
  viewer.setInput(((IPagingContentProvider<T>) content)
   .getModelProvider().getTableRows());
  ControlledColumnTableMetadata<T> metadata = content.getMetadata();
  for (int i = 0; i < metadata.getBean().getDeclaredFields().length; i++) {
   getViewerColumn(viewer, metadata.getBean().getDeclaredFields()[i],
    false);
  }
  viewer.getTable().setLayoutData(getLayoutData(parent));
  /*
   * I've tried getLayoutData(this) and I've also tried manipulating the
   * grabExcessHorizontalSpace and grabExcessVerticalSpace on the returned
   * GridData without getting the desired results
   */
  return viewer;
}
private TableViewerColumn getViewerColumn(TableViewer viewer, Field field,
   boolean listen) {
  final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
   SWT.NONE);
  final TableColumn column = viewerColumn.getColumn();
  setColumnProperties(viewer, column, field);
  viewerColumn.setLabelProvider(getColumnLabelProvider(field));
  // Only the filter TableViewer should have Listeners and EditingSupport
  if (listen) {
   // add sorting support
   viewerColumn.getColumn().addListener(SWT.Selection,
    new SortListener(field));
    // add support for saving column width preferences
    viewerColumn.getColumn()
     .addControlListener(createControlListener());
    // add editing support
    viewerColumn.setEditingSupport(getEditingSupport(viewer, field));
  }
  return viewerColumn;
}
private void setColumnProperties(TableViewer viewer, TableColumn column,
   Field field) {
  ControlledColumnTableMetadata<T> metadata =  ((IControlledColumnTableContentProvider<T>) viewer
   .getContentProvider()).getMetadata();
  column.setText(metadata.getColumnHeader(field));
  column.setToolTipText(metadata.getColumnHeader(field));
  if (metadata.isVisible(field)) {
   column.setWidth(metadata.getColumnWidth(field));
   column.setResizable(true);
   column.setMoveable(true);
  } else {
   column.setWidth(0);
   column.setResizable(false);
   column.setMoveable(false);
  }
}
private GridData getLayoutData(Composite parent) {
  GridLayout layout = (GridLayout) parent.getLayout();
  // Layout the viewer
  GridData gridData = new GridData();
  gridData.verticalAlignment = GridData.FILL;
  gridData.horizontalAlignment = GridData.FILL;
  gridData.horizontalSpan = layout.numColumns;
  gridData.grabExcessHorizontalSpace = true;
  gridData.grabExcessVerticalSpace = true;
  return gridData;
}
 ...
}

Любые предложения приветствуются.Заранее спасибо.

1 Ответ

1 голос
/ 31 января 2011
  1. не делайте этого

    GridData data = getLayoutData(parent); // inside getLayoutData: GridLayout layout = (GridLayout) parent.getLayout();
    this.setLayoutData(data);
    

    setLayout должен использоваться композитом, который организует дочерние элементы управления (this.setlayout).такой же как this.someControl.setLayoutData ().В вашем случае: родительские дескрипторы, где размещен ControlledColumnFilterTableComposite, а ControlledColumnFilterTableComposite - как устроен TableViewer.Это означает, что вы никогда не должны вызывать: parent.getLayout () и this.setLayoutData (), потому что вы можете не знать, какой родитель Layout использует, и использование недопустимых LayoutData приводит к некоторым исключениям.

  2. trythis

    this.setLayout(new GridLayout(1,false));
    this.filterViewer = createFilterViewer();
    this.filterViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,true));
    
    this.mainViewer = createMainViewer();
    this.mainViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,true));
    

    GridLayout работает как таблица в HTML - помещает элементы управления в ячейки.SWT.FILL означает, что элемент управления будет заполнять ячейку с сортировкой по горизонтали и вертикали, а значение true (3-й и 4-й аргумент) означает, что ячейка будет расширена до максимально доступного размера по горизонтали и вертикали

  3. удалить H_SCROLLПрокрутка в вашем Composite ScrolledComposite
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...