版权所有,禁止匿名转载;禁止商业使用。
学JAVA和GUI,必然会使用eclipse+windowsbuilder,那么在做类似编辑器的东西难免会遇到一些问题,比如:源程序如下
package src; import java.awt.Color; import java.awt.Graphics; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DragDetectEvent; import org.eclipse.swt.events.DragDetectListener; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; 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.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import com.cloudgarden.resource.SWTResourceManager; public class test1 extends org.eclipse.swt.widgets.Composite{ private Graphics g1; private Button button6; private Button button5; private Button button4; private Button button3; private Button line; private Canvas canvas1; private Button button1; private int x1,x2,y1,y2;//记录坐标位置 private enum checkState{button1,button2,button3,button4,button5,button6}; checkState check; { //Register as a resource user - SWTResourceManager will //handle the obtaining and disposing of resources SWTResourceManager.registerResourceUser(this); } public test1(Composite parent, int style) { super(parent, style); initGUI(); } /** * Initializes the GUI. */ private void initGUI() { try { this.setSize(557, 424); this.setBackground(SWTResourceManager.getColor(192, 192, 192)); FormLayout thisLayout = new FormLayout(); this.setLayout(thisLayout); this.setDragDetect(false); this.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent evt) { x2=evt.x; y2=evt.y; System.out.print(x2+y2); } public void mouseDown(MouseEvent evt) { x1=evt.x; y1=evt.y; x2=x1; y2=y1; System.out.print(x1+y1); } }); { //canvas FormData canvas1LData = new FormData(); canvas1LData.left = new FormAttachment(0, 1000, 96); canvas1LData.top = new FormAttachment(0, 1000, 21); canvas1LData.width = 362; canvas1LData.height = 385; canvas1 = new Canvas(this, SWT.None); canvas1.setLayoutData(canvas1LData); canvas1.setBackground(SWTResourceManager.getColor(255, 255, 255)); canvas1.setEnabled(false); canvas1.addPaintListener(new PaintListener() { public void paintControl(PaintEvent evt) { evt.gc.drawLine(x1, y1, x2, y2); System.out.println("canvas1.paintControl"); //TODO add your code for canvas1.paintControl } }); } { button1 = new Button(this, SWT.PUSH | SWT.CENTER); FormData button1LData = new FormData(); button1LData.left = new FormAttachment(0, 1000, 12); button1LData.top = new FormAttachment(0, 1000, 8); button1LData.width = 72; button1LData.height = 60; button1.setLayoutData(button1LData); button1.setImage(SWTResourceManager.getImage("src/箭头.bmp")); button1.setGrayed(true); } { line = new Button(this, SWT.PUSH | SWT.CENTER); FormData button2LData = new FormData(); button2LData.left = new FormAttachment(0, 1000, 12); button2LData.top = new FormAttachment(0, 1000, 72); button2LData.width = 72; button2LData.height = 63; line.setLayoutData(button2LData); line.setImage(SWTResourceManager.getImage("src/直线.bmp")); line.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { button2WidgetSelected(evt); } }); } { button3 = new Button(this, SWT.PUSH | SWT.CENTER); button3.setImage(SWTResourceManager.getImage("src/箭头2.bmp")); FormData button3LData = new FormData(); button3LData.left = new FormAttachment(0, 1000, 12); button3LData.top = new FormAttachment(0, 1000, 141); button3LData.width = 72; button3LData.height = 65; button3.setLayoutData(button3LData); } { button4 = new Button(this, SWT.PUSH | SWT.CENTER); button4.setImage(SWTResourceManager.getImage("src/组合线.bmp")); FormData button4LData = new FormData(); button4LData.left = new FormAttachment(0, 1000, 12); button4LData.top = new FormAttachment(0, 1000, 212); button4LData.width = 72; button4LData.height = 61; button4.setLayoutData(button4LData); } { button5 = new Button(this, SWT.PUSH | SWT.CENTER); button5.setImage(SWTResourceManager.getImage("src/CLASS.bmp")); FormData button5LData = new FormData(); button5LData.left = new FormAttachment(0, 1000, 12); button5LData.top = new FormAttachment(0, 1000, 279); button5LData.width = 72; button5LData.height = 59; button5.setLayoutData(button5LData); } { button6 = new Button(this, SWT.PUSH | SWT.CENTER); button6.setImage(SWTResourceManager.getImage("src/case.bmp")); FormData button6LData = new FormData(); button6LData.left = new FormAttachment(0, 1000, 12); button6LData.top = new FormAttachment(0, 1000, 350); button6LData.width = 72; button6LData.height = 62; button6.setLayoutData(button6LData); } this.layout(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Display display = Display.getDefault(); Shell shell = new Shell(display); test1 inst = new test1 (shell, SWT.NULL); Point size = inst.getSize(); shell.setLayout(new FillLayout()); shell.layout(); if(size.x == 0 && size.y == 0) { inst.pack(); shell.pack(); } else { Rectangle shellBounds = shell.computeTrim(0, 0, size.x, size.y); shell.setSize(shellBounds.width, shellBounds.height); } shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } private void button2WidgetSelected(SelectionEvent evt) { check=checkState.button2; System.out.print(check); } }
考:1、在canvas画"线"可以即时显示吗,若想在画布上抓取鼠标行为(座标等等),可行吗,目前只能在Composite和button有反应。
2、若想在画布上把画出来的图形作为新创建的对象ex:mydrawLine对象(建构即会调用drawLine()),那么该朝哪个方向着手。