2012-08-23 42 views
1

我刚开始使用swt的画布。我的印象是从图形控制器(gc)绘制命令可以在连接到画布的任何侦听器中执行。我猜虽然,我的问题是什么触发了油漆监听器方法paintControlJava swt canvas油漆侦听器如何工作?

canvas.redraw()是否也会导致它运行?

感谢任何能指引我朝着正确方向的人。如果有关于这个问题的教程或书籍(通常也用swt绘图),我很乐意听到他们的消息。

编辑: 这是代码,我遇到了graphCanvas没有填充多余的垂直空间的问题?当我填充过多的水平空间时它也不起作用。但是,当我将这些属性应用于复合材料时,它似乎起作用。任何想法?

Color black = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK); 
    chartComposite = new Composite(parent, SWT.NONE); 
    GridLayout chartGridLayout = new GridLayout(1,false); 
    GridData chartGridData = new GridData(); 
    chartGridData.grabExcessHorizontalSpace = true; 
    chartGridData.grabExcessVerticalSpace = true; 

    chartComposite.setLayout(chartGridLayout); 
    chartComposite.setLayoutData(chartGridData); 

    chartInnerComposite = new Composite(chartComposite, SWT.NONE); 
    GridLayout chartInnerGridLayout = new GridLayout(2,false); 
    GridData chartInnerGridData = new GridData(); 
    chartInnerGridData.grabExcessHorizontalSpace = true; 
    chartInnerGridData.grabExcessVerticalSpace = true; 
    chartInnerComposite.setLayout(chartInnerGridLayout); 
    chartInnerComposite.setLayoutData(chartInnerGridData); 
    /** 
    * Create the four canvases 
    */ 

    Canvas yCanvas = new Canvas(chartInnerComposite, SWT.None); 
    graphCanvas = new Canvas(chartInnerComposite, SWT.None); 
    GridLayout graphGridLayout = new GridLayout(1, false); 
    graphGridLayout.makeColumnsEqualWidth = false; 
    GridData graphGridData = new GridData(SWT.FILL); 
    graphGridData.widthHint = 400; 
    graphGridData.grabExcessVerticalSpace = true; 
    graphCanvas.setLayout(graphGridLayout); 
    graphCanvas.setLayoutData(graphGridData); 
    graphCanvas.addPaintListener(new PaintListener() { 

     @Override 
     public void paintControl(PaintEvent e) { 
      e.gc.drawLine(20, 20, 500, 500); 
      e.gc.drawRectangle(0, 0, graphCanvas.getSize().x -1, graphCanvas.getSize().y -1); 

      e.gc.drawLine(0, 40, 500, 500); 
      e.gc.drawLine(0, 0, 0, 1200); 
      e.gc.drawLine(0, 0, 1200, 0);    
     } 
    }); 
    /*graphCanvas.setSize(400, 400); 
    graphCanvas.redraw(); 
    graphCanvas.update();*/ 


    Canvas filler = new Canvas(chartInnerComposite, SWT.NONE); 
    Canvas xCanvas = new Canvas(chartInnerComposite, SWT.None); 
+0

我不明白你最后的问题。你能否提供一个SSCCE(http://sscce.org/)?然后我可以自己运行它并尝试帮助你。 – Baz

+0

我能够使用widthHint和heightHint为画布指定手动大小。但我无法让画布伸展过多的垂直和水平空间。 –

+0

你应该真的提供一个SSCCE。否则,我将不得不猜测发生了什么问题...... – Baz

回答

1

你的代码可以手动调用canvas.redraw(),然后触发paintControl事件。 SWT本身也会根据需要触发重绘,例如窗口大小调整和画布被其他窗口遮挡/不被遮挡的情况。

+0

谢谢,我该如何重新调整画布大小?当我使用canvas.setSize(w,h);代码似乎什么都不做?再次感谢您的帮助。 –

+0

在SWT中调整子组件的技巧总是在布局中,特别是它似乎使用GridLayout。我会推荐做两种模式中的一种:使用默认的GridData构造函数或不带参数的参数或带有四个参数(horizAlign,vertAlign,grabHoriz,grabVert)的构造函数。你的案例中的解决方案可能只是转移到“新的GridData(SWT.FILL,SWT.FILL,true,true)”。 – BenG

+0

你用这个答案打了记号。我一次只设置horizo​​ntalAlignment或horizo​​ntalGrabExcessSpace。让那些奇怪的东西继续下去。 –