我试图创建一个图例,而我想做的方式是有两个单独的组合,一个在scrolledComposite内部的另一个之上。顶层组合子项是标签和画布的另一种组合。该复合材料是从属性文件填充的。第二个复合材料与第一个复合材料相同,而子代是相同类型的复合材料。我将如何实现这一目标。
下面的代码是在读取文件时执行的,它将创建新的合成文件并填充主合成文件。我希望最后三个图例项与第一个图例项分开并充当第一个合成项。

@Override
public void createPartControl(Composite parent)
{
  display = parent.getDisplay();
  parent.setLayout(new FillLayout());
  // This enables the display to be able to be scrollable when needed
  scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER);
  scrolledComposite.setExpandHorizontal(true);
  scrolledComposite.setExpandVertical(true);
  // making a new composite inside of the scrolledComposite to be to add labels and canvases
  stepComposite = new Composite(scrolledComposite, SWT.NONE);
  blockedComposite = new Composite(scrolledComposite, SWT.NONE);
  // making the layout for the composite a row so when the the children reach the end of the shell
  // the children will wrap down to the next level
  RowLayout layout = new RowLayout();
  layout.pack = false;
  layout.spacing = 5;
  stepComposite.setLayout(layout);
  blockedComposite.setLayout(layout);
}

/**
* Adding a new composite for a rectangle and label to be added to the legend
* @param legendMessage
*/
public static void addNewComposite(String legendMessage, int compositePosition)
{
  final String message = legendMessage;
  final String[] s = message.split(",");
  final int position = compositePosition;
  if (display != null)
  {
     display.syncExec(new Runnable()
     {
        @Override
        public void run()
        {
           Composite com;
          if (position == 1)
           {
               com = new Composite(blockedComposite, SWT.NONE);
           }
           else
           {
               com = new Composite(stepComposite, SWT.NONE);
           }
//               Composite com = new Composite(stepComposite, SWT.NONE);
           com.setLayout(new GridLayout(2, false));
           // Creating the color using the RBG values
           final Color color =
                 new Color(display, Integer.parseInt(s[0]), Integer.parseInt(s[1]), Integer.parseInt(s[2]));

           // Creating a canvas for which the rectangle can be drawn on
           Canvas canvas = new Canvas(com, SWT.NONE);
           canvas.setLayoutData(new GridData(50,40));
           // TODO Maybe set the bounds of the canvas
           canvas.addPaintListener(new PaintListener()
           {
              public void paintControl(PaintEvent e)
              {
                 e.gc.drawRectangle(1, 1, 48, 38);
                 e.gc.setBackground(color);
                 e.gc.fillRectangle(2, 2, 47, 37);
              }
           });

           // Creating a label and setting the font
           Label label = new Label(com, SWT.NULL);
           final Font boldFont = new Font(label.getDisplay(), new FontData("Arial", 12, SWT.BOLD));
           label.setFont(boldFont);
           label.setText(s[3]);

           // Adding a color and font disposer to the composite
           com.addDisposeListener(new DisposeListener()
           {
              public void widgetDisposed(DisposeEvent e)
              {
                 color.dispose();
                 boldFont.dispose();
              }
           });

           // Adding the composite into a map to be able to be deleted when model stops
           comps.put(s[3], com);
           if (position == 1)
           {
//                  scrolledComposite.setContent(blockedComposite);
//                  scrolledComposite.setMinSize(blockedComposite.computeSize(1, 1000));
           }
           else
           {
              scrolledComposite.setContent(stepComposite);
              scrolledComposite.setMinSize(stepComposite.computeSize(1, 1000));
           }
           // Adding the composite to the scrolledComposite to be able to appear
 //               scrolledComposite.setContent(stepComposite);
           // Setting the size of the scrolledComposite
 //               scrolledComposite.setMinSize(stepComposite.computeSize(1, 1000));
        }
     });
  }
}


此代码用第二个复合代码替换了第一个复合代码,我希望有一些新的眼睛可以帮助我解决问题。

最佳答案

ScrolledComposite仅显示您在Composite上指定的setContent,在该级别不能有多个合成。

将一个Composite用作ScrolledComposite的直接子代,并将其他组合添加为该单个组合的子代。不要忘记在所有复合材料上设置布局。

09-15 22:06