您好我正在努力在类图上添加两个类之间的链接以显示它们的关系,类图视图允许添加与用户想要的一样多的类。这是在SWT中完成的,类(方形按钮)是使用FormLayout和FormData动态添加的,所以我不知道它们的确切位置。
我遇到的问题是,当我尝试通过getLocation()获取类(方形按钮)的位置时,它会为x和y返回0。这显然意味着drawLine()方法不会绘制任何东西。
我调查了To Display method 然而,这只返回不正确的类的X和Y位置,例如, (-757.451)。
任何帮助或方向都会很棒, 谢谢:D
编辑:下面是关于我的问题的代码片段
public void createClassButtons(Composite parent, Boolean pushDown) throws MalformedURLException, Exception
{
if(upButton == null || upButton.isDisposed() && !activePackageName.equals(""))
{
addUpButton(parent);
}
addNewClassButton(parent);
final String[] classes = JavaModelHelper.getClassNames(activePackageName); //Get the class names
for(int i = 0; i < classes.length;i++)
{
String entryString = classes[i];
entryString = entryString.substring(0,entryString.lastIndexOf('.'));
final int currentClassId = i;
Boolean createNew = true;
if(createNew)
{
classButtons.add(new ClassButton(parent,SWT.NONE,classes[i],i,activePackageName));
classButtons.get(i).setText(entryString);
classButtons.get(i).setMenu(buildMenuForClass(classes[i], classButtons.get(i)));
//Position the button
FormData buttonData = new FormData(90+(entryString.length() * 3),80);
if(i-1 >= 0)
{
buttonData.left = new FormAttachment(classButtons.get(i-1), 50, SWT.RIGHT);
buttonData.bottom = new FormAttachment(classButtons.get(i-1), 0, SWT.BOTTOM);
buttonData.top = new FormAttachment(classButtons.get(i-1),0, SWT.TOP);
}
if(i == 0)
{
buttonData.left = new FormAttachment(5);
buttonData.top = pushDown ? new FormAttachment(25):new FormAttachment(15);
}
classButtons.get(i).setLayoutData(buttonData);
classButtons.get(i).getColor();
checkSuperClass(classButtons.get(i),parent);
}
}
parent.layout();
parent.getShell().layout();
}
/*
* Check Super Class - Checks if the class is inherited.
*/
void checkSuperClass(ClassButton b, Composite parent) throws Exception
{
Class<?> superClass = JavaModelHelper.getSuperclass(b.getMyClass());
if(superClass != null)
{
for(ClassButton a:classButtons)
{
if(a.getMyClass().equals(superClass))
{
drawInheritanceLink(b,a,parent);
}
}
}
}
/*
* Draw Inheritance Link - Draws an arrow tipped line between two given classes.
*/
void drawInheritanceLink(ClassButton a, ClassButton b, Composite parent)
{
GC gc = new GC(parent);
gc.drawLine(a.getLocation().x, a.getLocation().y, b.getLocation().x, b.getLocation().y);
}
答案 0 :(得分:1)
在checkSuperClass
之前调用在parent.layout()
中绘制线条的代码。只有布局才能计算按钮的位置,这就是为什么它们的位置仍然是0/0。
除此之外,如果调整shell的大小或其他原因使得必须重新绘制线条,您的绘图代码将不会更新。因此,您需要将所有按钮放在Canvas
窗口小部件中,并为此窗口小部件添加SWT.Paint
侦听器。只要需要重绘画布,就会调用绘图侦听器。在事件句柄中,你可以在按钮之间绘制连接线。
canvas.addListener( SWT.Paint, new Listener() {
public void handleEvent( Event event ) {
event.gc.drawLine( ... );
}
} );
此外,我建议您阅读Creating Your Own Widgets using SWT,以便在SWT中更好地保留所有者绘制和自定义小部件。
如果您的图表有关于布局和与图表元素交互的更复杂要求,甚至编辑图表,您也可以考虑使用Draw2D或GEF或Graphiti。