为 RCP 显示 SWT 组合的问题

Issue in displaying of SWT composite for RCP

我正在我的 Eclipse RCP 应用程序中创建一个简单的 SWT 容器,但在显示它的 location/order 时遇到了问题。这是我正在使用的代码。

@PostConstruct
public void createControls(Composite parent)
{
     parent.setBackground(new Color (Display.getCurrent (), 255, 144, 0));
     GridData parentData = new GridData(SWT.FILL, SWT.FILL, true, true);
     parent.setLayout(new GridLayout(1, true));
     parent.setLayoutData(parentData);
     Device device = Display.getCurrent ();
     Color backgroundColor = parent.getBackground();
     Color whiteColor = new Color (device, 255, 255, 255);
     Color randomColor = new Color (device, 255, 0, 0);

     final Composite criteriaContainer = new Composite(parent, SWT.BORDER);
     criteriaContainer.setBackground(randomColor);
     final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
     final GridData comboGridData = new GridData(SWT.FILL, SWT.TOP, true, false,1,1);

     criteriaContainer.setLayout(new GridLayout(1, false));
     criteriaContainer.setLayoutData(gridData);

     final Label primaryComboLabel = new Label(criteriaContainer, SWT.NONE);
     primaryComboLabel.setLayoutData(comboGridData);
     primaryComboLabel.setForeground(whiteColor);
     primaryComboLabel.setText("View by:");
     criteriaContainer.layout();
     criteriaContainer.pack();
     parent.layout();
     parent.pack();
}

我似乎无法让标签出现在应用程序的顶部(出现在底部中心)[在此处输入图像描述][1]。如果我编写相同的代码并将其作为独立的 SWT 应用程序执行,标签将出现在左上角。 [1]: http://i.stack.imgur.com/OL312.png 这是我有一个独立的 swt 应用程序时的区别。

public void showHistoryContainer() throws Exception {
        Display display = new Display();
        final Shell shell = new Shell(display); 
        shell.setBackground(new Color (Display.getCurrent (), 255, 144, 0));

其余代码相同。 [2]: http://i.stack.imgur.com/fJmR6.png

知道为什么会发生这种情况吗?

注意:在我的 RCP 应用程序中,我没有对我的父组合进行任何其他处理。

你不说 createControls 是什么的一部分。是 MPart 吗?

我无法真正重现此问题,但您的代码中存在许多问题可能会导致此问题。

从不 更改传递给代码的 Composite 的布局(此处为 parent)。创建另一个 Composite 作为子项并在其上设置布局。

不要调用 layoutpack

所以我简化了你的代码:

@PostConstruct
public void postConstruct(Composite parent)
{
  Display device = parent.getDisplay();

  Composite body = new Composite(parent, SWT.NONE);
  body.setBackground(new Color(device, 255, 144, 0));
  body.setLayout(new GridLayout());

  Color whiteColor = new Color(device, 255, 255, 255);
  Color randomColor = new Color(device, 255, 0, 0);

  Composite criteriaContainer = new Composite(body, SWT.BORDER);
  criteriaContainer.setBackground(randomColor);
  criteriaContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
  criteriaContainer.setLayout(new GridLayout());

  Label primaryComboLabel = new Label(criteriaContainer, SWT.NONE);
  primaryComboLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
  primaryComboLabel.setForeground(whiteColor);
  primaryComboLabel.setText("View by:");
}

最后,如果您像这样创建 Color 对象,您必须安排处置它们,否则您将泄漏资源。如果这是 e4 RCP,您应该改用 CSS 支持。