在ScrolledComposite中有两个复合体

时间:2017-07-13 17:54:16

标签: java eclipse eclipse-plugin swt

我正在尝试创建一个图例,我想要的方式是有两个单独的复合体,一个在scrollledComposite内部的另一个上面。顶级复合子元素是标签和画布的另一种组合。此复合从属性文件中填充。第二个复合材料与第一个复合材料相同,其中儿童是同一种复合材料。我怎么能够实现这一目标。 以下代码的作用是在读取文件时,它会生成新的复合并填充主复合。我希望最后三个图例项目与第一个项目分开,并作为第一个复合项目。

@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));
        }
     });
  }
}

这段代码用第二个复合材料替换了第一个复合材料,我很欣赏一些新的眼睛来帮助我弄清楚问题。

1 个答案:

答案 0 :(得分:1)

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

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