原文: http://www.cnblogs.com/bjzhanghao/archive/2006/09/05/495747.html
該文章來之“八進制”。
public class Draw2DLayoutExample { static Figure canvas;//Parent figure which uses XYLayout as its layout manager static RectangleFigure containerFig;//canvas's only child, which uses ToolbarLayout static RectangleFigure innerContainerFig;//containerFig's only child, which uses ToolbarLayout, too static RectangleFigure firstGreenFig;//innerContainerFig's first child, which has no layout manager static Dimension dimension = new Dimension(40, 20); public static void main(String args[]) { Shell shell = new Shell(); shell.setLayout(new GridLayout(1, false)); //Create control buttons Button button = new Button(shell, SWT.PUSH); GridData gd = new GridData(); button.setLayoutData(gd); button.setText("Add Red"); Button button2 = new Button(shell, SWT.PUSH); gd = new GridData(); button2.setLayoutData(gd); button2.setText("Add Green"); Button button3 = new Button(shell, SWT.PUSH); gd = new GridData(); button3.setLayoutData(gd); button3.setText("Enlarge Green"); //Draw2d area LightweightSystem lws = new LightweightSystem(shell); //The canvas figure which fills right half of shell canvas = new Figure(); canvas.setLayoutManager(new XYLayout()); lws.setContents(canvas); System.out.println(canvas.getLayoutManager()); //A rectangle figure containerFig = new RectangleFigure(); canvas.add(containerFig); canvas.getLayoutManager().setConstraint(containerFig, new Rectangle(120, 10, -1, -1)); ToolbarLayout layout = new ToolbarLayout(); layout.setVertical(true); layout.setSpacing(3); layout.setStretchMinorAxis(false); containerFig.setLayoutManager(layout); containerFig.setBorder(new MarginBorder(5)); RectangleFigure fig = new RectangleFigure(); fig.setBackgroundColor(ColorConstants.red); fig.setSize(dimension); containerFig.add(fig); //A inner container figure innerContainerFig = new RectangleFigure(); ToolbarLayout layout2 = new ToolbarLayout(); layout2.setVertical(false); layout2.setSpacing(3); layout2.setStretchMinorAxis(false); innerContainerFig.setLayoutManager(layout2); innerContainerFig.setBorder(new MarginBorder(5)); containerFig.add(innerContainerFig); //The first green figure in innerContainerFig firstGreenFig = new RectangleFigure(); firstGreenFig.setBackgroundColor(ColorConstants.green); firstGreenFig.setSize(dimension); innerContainerFig.add(firstGreenFig); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { RectangleFigure fig = new RectangleFigure(); fig.setBackgroundColor(ColorConstants.red); fig.setPreferredSize(dimension); containerFig.add(fig); } }); button2.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { RectangleFigure fig = new RectangleFigure(); fig.setBackgroundColor(ColorConstants.green); fig.setPreferredSize(dimension); innerContainerFig.add(fig); } }); button3.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { //Make this figure bigger, and see if the outer figure grows accordingly firstGreenFig.setPreferredSize(100, 100); } }); shell.setSize(500, 400); shell.open(); shell.setText("Draw2D Layout Example"); Display display = Display.getDefault(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } }
文中提到了:
Draw2D里Figure類的setPreferredSize(Dimension)和setSize(Dimension)的區別是,setSize()方法不會調用revalidate()方法導致重新layout,而只是調用repaint()對所涉及到的“臟”區域進行重繪(repaint)。setPreferredSize()方法可以約等于setSize()方法+revalidate()方法,因為在Figure對getPreferredSize(int,int)的實現里,若該figure沒有任何layoutmanager,則返回當前size:
例如當父圖形使用XYLayout,子圖形使用ToolbarLayout時,假設在子圖形里又增加了子子圖形(子圖形里的子圖形),add()方法會導致revalidate()的調用,這時父圖形的xylayout將檢查子圖形是否具有constraint,如果有并且有至少一個方向為-1,則利用子圖形上的ToolbarLayout計算出子圖形新的尺寸,這個尺寸是和子圖形里包含的子子圖形的數目有關的(ToolbarLayout會把每個子圖形的寬/高度加起來,加上其中間隔的空間,再考慮圖形的邊框,返回得到的尺寸)。
?
指出了figure什么時候,調用revalidate()。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
