我试图创建一个图例,而我想做的方式是有两个单独的组合,一个在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
的直接子代,并将其他组合添加为该单个组合的子代。不要忘记在所有复合材料上设置布局。