2014-07-27 53 views
0

我试图在画布上显示比窗口/画布的大小限制允许的更多。我知道这有几个方法。我可以使用FigureCanvas,但我不确定视口如何与它结合。我选择创建一个ScrolledComposite并在其中放置一个画布。我的问题是滚动条出现,但移动它们对画布上显示的内容没有任何影响。任何人都可以请指出我正确的方向来解决这个问题吗?谢谢。 *我添加了简短的可测试代码来说明问题。启用画布SWT的滚动Draw2d

import org.eclipse.draw2d.ColorConstants; 
import org.eclipse.draw2d.Figure; 
import org.eclipse.draw2d.IFigure; 
import org.eclipse.draw2d.LightweightSystem; 
import org.eclipse.draw2d.SimpleRaisedBorder; 
import org.eclipse.draw2d.geometry.Rectangle; 
import org.eclipse.swt.widgets.Dialog; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Canvas; 
import org.eclipse.swt.SWT; 
import org.eclipse.wb.swt.SWTResourceManager; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.layout.GridData; 
import org.xml.sax.SAXException; 
import org.eclipse.swt.custom.ScrolledComposite; 


public class ScrollDemo extends Dialog { 

    protected Shell shell; 
    protected IFigure panel; 
    protected IFigure v_panel; 

    public static void main(String[] args) 
    { 
     ScrollDemo act= new ScrollDemo(new Shell(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); 
     act.open(); 
    } 


    /** 
    * Create the dialog. 
    * @param parent 
    * @param style 
    */ 
    public ScrollDemo(Shell parent, int style) { 
     super(parent, style); 
     setText("Scrolling Demo"); 
    } 

    /** 
    * Open the dialog. 
    * @throws SAXException 
    */ 
    public void open(){ 
      createContents(); 
     shell.open(); 
     shell.layout(); 
     Display display = getParent().getDisplay(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
    } 

    /** 
    * Create contents of the dialog. 
    */ 
    private void createContents(){ 
     shell = new Shell(getParent(), getStyle()); 
     shell.setSize(475, 375); 
     shell.setText(getText()); 
     shell.setLayout(new GridLayout(1, false)); 

     ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); 
     scrolledComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_MAGENTA)); 
     GridData gd_scrolledComposite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); 
     gd_scrolledComposite.widthHint = 453; 
     gd_scrolledComposite.heightHint = 245; 
     scrolledComposite.setLayoutData(gd_scrolledComposite); 
     scrolledComposite.setExpandHorizontal(true); 
     scrolledComposite.setExpandVertical(true); 

     Canvas canvas = new Canvas(scrolledComposite, SWT.H_SCROLL | SWT.V_SCROLL); 
     canvas.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_YELLOW)); 
     scrolledComposite.setContent(canvas); 
     scrolledComposite.setMinSize(canvas.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 

     LightweightSystem lws = new LightweightSystem(canvas); 
     panel = new Figure(); 
     lws.setContents(panel); 

     int starting_xpos= 0; 
     int starting_ypos= 0; 
     makeStructure(starting_xpos, starting_ypos, 0); 


    } 

    private void makeStructure(int starting_xpos, int starting_ypos, int index) 
    { 
     org.eclipse.draw2d.Label lblRoot= new org.eclipse.draw2d.Label(); 
     Rectangle rect= new Rectangle(starting_xpos, starting_ypos, 200, 25); 
     //Anything longer than 200 cannot be displayed 

     lblRoot.setText("BAAAAAAAAAAAB"); 

     lblRoot.setBorder(new SimpleRaisedBorder()); 
     lblRoot.setForegroundColor(ColorConstants.black); 
     lblRoot.setVisible(true); 
     lblRoot.setOpaque(true); 
     lblRoot.setBounds(rect); 

     panel.add(lblRoot); 

     if (index<10) 
      { 
       makeStructure(starting_xpos+20, starting_ypos+50, index+1); 
      } 
     } 


    } 

回答

2

好吧,我设法得到它的工作通过使用FigureCanvas代替Canvas并使用Viewport根元素:

public class Draw2d extends Dialog 
{ 
    protected Shell  shell; 
    private Viewport viewport; 

    public static void main(String[] args) 
    { 
     Draw2d act = new Draw2d(new Shell(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); 
     act.open(); 
    } 

    public Draw2d(Shell parent, int style) 
    { 
     super(parent, style); 
     setText("Draw2d"); 
    } 

    public void open() 
    { 
     createContents(); 
     shell.open(); 
     shell.layout(); 
     Display display = getParent().getDisplay(); 
     while (!shell.isDisposed()) 
     { 
      if (!display.readAndDispatch()) 
      { 
       display.sleep(); 
      } 
     } 
    } 

    private void createContents() 
    { 
     shell = new Shell(getParent(), getStyle()); 
     shell.setSize(475, 375); 
     shell.setText(getText()); 
     shell.setLayout(new GridLayout(1, false)); 

     FigureCanvas canvas = new FigureCanvas(shell, SWT.H_SCROLL | SWT.V_SCROLL); 
     canvas.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_DARK_YELLOW)); 
     canvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     canvas.setScrollBarVisibility(FigureCanvas.ALWAYS); 
     viewport = new Viewport(true); 
     canvas.setViewport(viewport); 

     LightweightSystem lws = new LightweightSystem(canvas); 
     lws.setContents(viewport); 

     makeStructure(0, 0, 0); 
    } 

    private void makeStructure(int starting_xpos, int starting_ypos, int index) 
    { 
     org.eclipse.draw2d.Label lblRoot = new org.eclipse.draw2d.Label(); 
     Rectangle rect = new Rectangle(starting_xpos, starting_ypos, 210, 25); 

     lblRoot.setText("BAAAAAAAAAAAB"); 

     lblRoot.setBorder(new SimpleRaisedBorder()); 
     lblRoot.setForegroundColor(ColorConstants.black); 
     lblRoot.setVisible(true); 
     lblRoot.setOpaque(true); 
     lblRoot.setBounds(rect); 

     viewport.add(lblRoot); 

     if (index < 10) 
     { 
      makeStructure(starting_xpos + 20, starting_ypos + 50, index + 1); 
     } 
    } 
} 

滚动现在工作得很好。

+0

非常感谢。如何增加可通过滚动访问的画布大小?改变画布/视口的边界对我没有任何帮助。 – Asher

+0

@Asher你是否需要增加它,因为你添加了新的数字,他们超出了界限,或者你只是想增加它? – Baz

+0

我已经有了这两种情况下的需求...... – Asher