| SWT中没有AWT的BorderLayout规划管理器。下面是SWT下的自定义实现: BorderLayout.java
 package swt_jface.demo2;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Layout;
 public class BorderLayout extends Layout {
 public static final int NORTH = 0;
 public static final int SOUTH = 1;
 public static final int CENTER = 2;
 public static final int EAST = 3;
 public static final int WEST = 4;
 public static class BorderData {
 
 public int region = CENTER;
 public BorderData() {
 }
 public BorderData(int region) {
 this.region = region;
 }
 }
 public Control[] controls = new Control[5];
 Point[] sizes;
 int width;
 int height;
 protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
 
 if (sizes == null || flushCache == true)
 refreshSizes(composite.getChildren());
 int w = wHint;
 int h = hHint;
 if (w == SWT.DEFAULT) w = width;
 if (h == SWT.DEFAULT) h = height;
 return new Point(w, h);
 }
 protected void layout(Composite composite, boolean flushCache) {
 if (flushCache || sizes == null)
 refreshSizes(composite.getChildren());
 Rectangle clientArea = composite.getClientArea();
 if (controls[NORTH] != null) {
 controls[NORTH].setBounds(
 clientArea.x,
 clientArea.y,
 clientArea.width,
 sizes[NORTH].y);
 }
 if (controls[SOUTH] != null) {
 controls[SOUTH].setBounds(
 clientArea.x,
 clientArea.y + clientArea.height - sizes[SOUTH].y,
 clientArea.width,
 sizes[SOUTH].y);
 }
 if (controls[WEST] != null) {
 controls[WEST].setBounds(
 clientArea.x,
 clientArea.y + sizes[NORTH].y,
 sizes[WEST].x,
 clientArea.height - sizes[NORTH].y - sizes[SOUTH].y);
 }
 if (controls[EAST] != null) {
 controls[EAST].setBounds(
 clientArea.x + clientArea.width - sizes[EAST].x,
 clientArea.y + sizes[NORTH].y,
 sizes[EAST].x,
 clientArea.height - sizes[NORTH].y - sizes[SOUTH].y);
 }
 if (controls[CENTER] != null) {
 controls[CENTER].setBounds(
 clientArea.x + sizes[WEST].x,
 clientArea.y + sizes[NORTH].y,
 clientArea.width - sizes[WEST].x - sizes[EAST].x,
 clientArea.height - sizes[NORTH].y - sizes[SOUTH].y);
 }
 }
 private void refreshSizes(Control[] children) {
 
 for (int i = 0; i < children.length; i++) {
 Object layoutData = children.getLayoutData();
 if (layoutData == null || (!(layoutData instanceof BorderData)))
 continue;
 BorderData borderData = (BorderData) layoutData;
 if (borderData.region < 0 || borderData.region > 4) // Invalid.
 continue;
 controls[borderData.region] = children;
 }
 width = 0;
 height = 0;
 if (sizes == null)
 sizes = new Point[5];
 for (int i = 0; i < controls.length; i++) {
 Control control = controls;
 if (control == null) {
 sizes = new Point(0, 0);
 } else {
 sizes = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
 }
 }
 width = Math.max(width, sizes[NORTH].x);
 width = Math.max(width, sizes[WEST].x + sizes[CENTER].x + sizes[EAST].x);
 width = Math.max(width, sizes[SOUTH].x);
 height = Math.max(Math.max(sizes[WEST].y, sizes[EAST].y), sizes[CENTER].y)
 + sizes[NORTH].y
 + sizes[SOUTH].y;
 }
 }
 
 测试代码:
 BorderLayoutSample.java
 package swt_jface.demo2;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 public class BorderLayoutSample {
 
 Display display = new Display();
 Shell shell = new Shell(display);
 public BorderLayoutSample() {
 
 shell.setLayout(new BorderLayout());
 
 Button buttonWest = new Button(shell, SWT.PUSH);
 buttonWest.setText("West");
 buttonWest.setLayoutData(new BorderLayout.BorderData(BorderLayout.WEST));
 
 Button buttonEast = new Button(shell, SWT.PUSH);
 buttonEast.setText("East");
 buttonEast.setLayoutData(new BorderLayout.BorderData(BorderLayout.EAST));
 Button buttonNorth = new Button(shell, SWT.PUSH);
 buttonNorth.setText("North");
 buttonNorth.setLayoutData(new BorderLayout.BorderData(BorderLayout.NORTH));
 
 Button buttonSouth = new Button(shell, SWT.PUSH);
 buttonSouth.setText("South");
 buttonSouth.setLayoutData(new BorderLayout.BorderData(BorderLayout.SOUTH));
 
 Text text = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
 text.setText("Center");
 text.setLayoutData(new BorderLayout.BorderData(BorderLayout.CENTER));
 
 shell.pack();
 shell.open();
 
 while (!shell.isDisposed()) {
 if (!display.readAndDispatch()) {
 display.sleep();
 }
 }
 display.dispose();
 }
 public static void main(String[] args) {
 new BorderLayoutSample();
 }
 }
 |