获取小部件的位置以允许从小部件 a 到 b 画一条线

Get location of a widget to allow drawing a line from widget a to b

嗨,我正在努力在 class 图表上的 2 classes 之间添加一个 link 以显示它们的关系,class 图表视图允许添加为许多 classes 随用户需要。这是在 SWT 中完成的,classes(这是一个方形按钮)是使用 FormLayout 和 FormData 动态添加的,所以我不知道它们的确切位置。

我遇到的问题是,当我尝试通过 getLocation() 获取 class(方形按钮)的位置时,x 和 y 都为 returns 0。这显然意味着 drawLine() 方法不绘制任何东西。

我调查过 To Display method 然而,这只是 类 的 returns 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);
    }

checkSuperClass 中绘制线条的代码在 parent.layout() 之前调用。只有布局计算按钮的位置,这就是为什么它们的位置仍然是 0/0。

除此之外,如果 shell 调整大小或其他原因需要重新绘制线条,您的绘图代码将不会更新。因此,您需要将所有按钮放在一个 Canvas 小部件中,并向该小部件添加一个 SWT.Paint 侦听器。每当 canvas 需要重绘时调用绘制侦听器。然后,您可以在事件句柄中绘制按钮之间的连接线。

canvas.addListener( SWT.Paint, new Listener() {
  public void handleEvent( Event event ) {
    event.gc.drawLine( ... );
  }
} );

此外,我建议阅读 Creating Your Own Widgets using SWT 以更好地理解 SWT 中的自绘和自定义小部件。

如果您的图表对布局和与图表元素的交互甚至编辑图表有更复杂的要求,您也可以考虑使用 Draw2D or GEF or Graphiti