2012-01-29 25 views
1

我想用JAVA中的ZEST framwework繪製圖形。代碼的預期工作如下:當按鈕按下時不使用ZEST框架的圖形繪製?

1)Shell設置爲FormLayout。
2)使用FormData自定義添加了標籤,文本框和按鈕。
3)在按鈕右邊添加了一個複合(帶有邊框的那個)。
4)爲按鈕增加了一個監聽器
5)當按下按鈕時,應該在按鈕右側的組合上創建一個包含三個節點「Rock」,「Paper」和Scissors的圖形。 (僅限於複合材料)。

但該圖不顯示。

請幫助我找出錯誤。 在此先感謝。

import java.io.FileNotFoundException; 
    import java.io.IOException; 

    import org.eclipse.swt.SWT; 
    import org.eclipse.swt.events.DisposeEvent; 
    import org.eclipse.swt.events.DisposeListener; 
    import org.eclipse.swt.graphics.Font; 
    import org.eclipse.swt.graphics.FontData; 
    import org.eclipse.swt.layout.FormAttachment; 
    import org.eclipse.swt.layout.FormData; 
    import org.eclipse.swt.layout.FormLayout; 
    import org.eclipse.swt.widgets.Button; 
    import org.eclipse.swt.widgets.Composite; 
    import org.eclipse.swt.widgets.Display; 
    import org.eclipse.swt.widgets.Event; 
    import org.eclipse.swt.widgets.Label; 
    import org.eclipse.swt.widgets.Listener; 
    import org.eclipse.swt.widgets.Shell; 
    import org.eclipse.swt.widgets.Text; 
    import org.eclipse.zest.core.widgets.Graph; 
    import org.eclipse.zest.core.widgets.GraphConnection; 
    import org.eclipse.zest.core.widgets.GraphNode; 
    import org.eclipse.zest.layouts.LayoutStyles; 
    import org.eclipse.zest.layouts.algorithms.SpringLayoutAlgorithm; 

    public class Demo{ 
     public static void main(String[] args) throws FileNotFoundException, IOException { 
      Display display = new Display(); 
      final Shell shell = new Shell(display); 
      shell.setText("Demo Map"); 

      FormLayout formLayout= new FormLayout(); 
      shell.setLayout(formLayout); 

      //Label 
      Label label = new Label(shell, SWT.NONE); 
      label.setText("TEXT:"); 
      FontData[] fontData = label.getFont().getFontData(); 
      for(int i = 0; i < fontData.length; ++i) 
       fontData[i].setHeight(12); 

      final Font newFont = new Font(display, fontData); 
      label.setFont(newFont); 
      FormData formData= new FormData(); 
      formData.top= new FormAttachment(0, 6); 
      formData.left= new FormAttachment(0,5); 
      label.setLayoutData(formData); 

      //Listener for font object(we created it, so we dispose it) 
      label.addDisposeListener(new DisposeListener() { 
       public void widgetDisposed(DisposeEvent e) { 
        newFont.dispose(); 
       } 
      }); 

      //Text BOX 

      final Text textBox= new Text(shell, SWT.NONE); 
      FormData textData = new FormData(); 
      textData.top= new FormAttachment(0, 8); 
      textData.left= new FormAttachment(label, 10); 
      textData.height= 20; 
      textData.width= 200; 
      textBox.setFont(newFont); 
      textBox.setLayoutData(textData); 

      //Button 

      Button button = new Button(shell, SWT.PUSH); 
      button.setText("Enter"); 
      FormData buttonData= new FormData(); 
      buttonData.top= new FormAttachment(0,5); 
      buttonData.left= new FormAttachment(textBox, 10); 
      buttonData.height= 25; 
      buttonData.width=50; 
      button.setLayoutData(buttonData); 


      //Composite to hold the graph visual 

      final Composite composite = new Composite(shell, SWT.BORDER); 
      FormData compositeFormData= new FormData(); 
      compositeFormData.top = new FormAttachment(0,5); 
      compositeFormData.left = new FormAttachment(button,15); 
      compositeFormData.right= new FormAttachment(100,-10); 
      compositeFormData.bottom= new FormAttachment(100,-10); 
      composite.setLayoutData(compositeFormData); 


      //drawNodes on button press 
      button.addListener(SWT.Selection, new Listener() { 
       public void handleEvent(Event e) { 
        switch (e.type) { 
        case SWT.Selection: 
        System.out.println("Button pressed"); 
        Graph g = new Graph(composite, SWT.NONE); 
        GraphNode n = new GraphNode(g, SWT.NONE, "Paper"); 
        GraphNode n2 = new GraphNode(g, SWT.NONE, "Rock"); 
        GraphNode n3 = new GraphNode(g, SWT.NONE, "Scissors"); 
        new GraphConnection(g, SWT.NONE, n, n2); 
        new GraphConnection(g, SWT.NONE, n2, n3); 
        new GraphConnection(g, SWT.NONE, n3, n); 
        g.setLayoutAlgorithm(new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), true); 
        break; 
        } 
       } 
       }); 



      shell.open(); 
      while(!display.isDisposed()){ 
       if(!display.readAndDispatch()){ 
        display.sleep(); 
       } 
      } 
      display.dispose(); 
     } 


    } 

回答

1

我認爲問題在於圖形只能在FillLayout上繪製。正如你在example中看到的那樣,它們使用FillLayout而不是FormLayout。

+0

實際上是不讓我在複合圖上繪製圖。 如果相反,我在偵聽器內部創建了一個新的shell(帶有FillLayout),圖形顯示......我也試過使用Canvas,但沒有結果。我不想真的創建一個新的shell,因爲它打開了一個新窗口。 – 2012-01-30 11:34:13