获取窗口小部件的位置以允许从窗口小部件a到b绘制线

时间:2015-03-08 16:50:02

标签: java widget swt

您好我正在努力在类图上添加两个类之间的链接以显示它们的关系,类图视图允许添加与用户想要的一样多的类。这是在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);
    }

1 个答案:

答案 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中更好地保​​留所有者绘制和自定义小部件。

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