----------------------------------------------------------------------------------------------------
学习: http://www.blogjava.net/youxia/archive/2006/12/01/84855.html
----------------------------------------------------------------------------------------------------
1. 新建视图 CanvasView:
package hellorcp.canvas;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
public class CanvasView extends ViewPart {
public Canvas canvas;
@Override
public void createPartControl(Composite parent) {
// TODO 自动生成方法存根
canvas = new Canvas(parent, SWT.NONE);
}
@Override
public void setFocus() {
// TODO 自动生成方法存根
}
}
2. 绘制椭圆菜单 DrawOvalAction:
package hellorcp.canvas;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.graphics.GC;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class DrawOvalAction implements IWorkbenchWindowActionDelegate {
IWorkbenchWindow window;
public void dispose() {
// TODO Auto-generated method stub
}
public void init(IWorkbenchWindow arg0) {
this.window = arg0;
}
public void run(IAction arg0) {
IViewReference[] vfs = window.getActivePage().getViewReferences();
IViewPart vw;
for (int i = 0; i < vfs.length; i++) {
vw = vfs[i].getView(false);
if (vw.getTitle().equals("画图板")) {
GC gc = new GC(((CanvasView) vw).canvas);
gc.drawOval(80, 50, 100, 100);
gc.dispose();
}
}
}
public void selectionChanged(IAction arg0, ISelection arg1) {
// TODO Auto-generated method stub
}
}
3. 修改 Perspective.java 如下:
package hellorcp;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
// FirstView
String editorArea = layout.getEditorArea();
// layout.addView("hellorcp.view.FirstView", IPageLayout.RIGHT, 0.2f,
// editorArea);
// SecondView
// layout.setEditorAreaVisible(false);
// layout.addView("hellorcp.view.SecondView", IPageLayout.RIGHT, 0.5f,
// editorArea);
// OleView
// layout.addView("hellorcp.ole.OleView", IPageLayout.RIGHT, 0.5f,
// editorArea);
// CanvasView
layout.addView("hellorcp.canvas.CanvasView", IPageLayout.RIGHT, 0.5f,
editorArea);
}
}
4. 配置 plugin.xml, 片段如下:
1) action:
<action class ="hellorcp.canvas.DrawOvalAction" icon ="icons/alt_window_16.gif" id ="hellorcp.canvas.DrawOvalAction" label ="绘制椭圆" menubarPath ="hellorcp.firstmenu/additions" style ="push" toolbarPath ="additions" tooltip ="绘制椭圆" />
2) view:
<view class="hellorcp.canvas.CanvasView" id="hellorcp.canvas.CanvasView" name="画图板" />
5. 保存,运行,效果如下:
6. 绘制矩形、渐变矩形、图片:
1) 矩形action:
package hellorcp.canvas;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.graphics.GC;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class DrawRectAction implements IWorkbenchWindowActionDelegate {
IWorkbenchWindow window;
public void dispose() {
// TODO Auto-generated method stub
}
public void init(IWorkbenchWindow arg0) {
this.window = arg0;
}
public void run(IAction arg0) {
IViewReference[] vfs = window.getActivePage().getViewReferences();
IViewPart vw;
for (int i = 0; i < vfs.length; i++) {
vw = vfs[i].getView(false);
if (vw.getTitle().equals("画图板")) {
GC gc = new GC(((CanvasView) vw).canvas);
gc.drawRectangle(280, 50, 100, 100);
gc.dispose();
}
}
}
public void selectionChanged(IAction arg0, ISelection arg1) {
// TODO Auto-generated method stub
}
}
2) 渐变矩形action:
package hellorcp.canvas;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class DrawGradientAction implements IWorkbenchWindowActionDelegate {
IWorkbenchWindow window;
public void dispose() {
// TODO Auto-generated method stub
}
public void init(IWorkbenchWindow arg0) {
this.window = arg0;
}
public void run(IAction arg0) {
IViewReference[] vfs = window.getActivePage().getViewReferences();
IViewPart vw;
for (int i = 0; i < vfs.length; i++) {
vw = vfs[i].getView(false);
if (vw.getTitle().equals("画图板")) {
GC gc = new GC(((CanvasView) vw).canvas);
gc.setBackground(window.getShell().getDisplay().getSystemColor(
SWT.COLOR_BLUE));
gc.fillGradientRectangle(80, 200, 100, 100, false);
gc.dispose();
}
}
}
public void selectionChanged(IAction arg0, ISelection arg1) {
// TODO Auto-generated method stub
}
}
3) 图片action:
package hellorcp.canvas;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class DrawImageAction implements IWorkbenchWindowActionDelegate {
IWorkbenchWindow window;
public void dispose() {
// TODO Auto-generated method stub
}
public void init(IWorkbenchWindow arg0) {
this.window = arg0;
}
public void run(IAction arg0) {
IViewReference[] vfs = window.getActivePage().getViewReferences();
IViewPart vw;
for (int i = 0; i < vfs.length; i++) {
vw = vfs[i].getView(false);
if (vw.getTitle().equals("画图板")) {
GC gc = new GC(((CanvasView) vw).canvas);
Image img = new Image(window.getShell().getDisplay(), "E:\\develop\\RCP\\HelloRCP\\splash.bmp");
gc.drawImage(img, 280, 200);
gc.dispose();
}
}
}
public void selectionChanged(IAction arg0, ISelection arg1) {
// TODO Auto-generated method stub
}
}
4) action配置:
<action class ="hellorcp.canvas.DrawRectAction" icon ="icons/alt_window_16.gif" id ="hellorcp.canvas.DrawRectAction" label ="绘制矩形" menubarPath ="hellorcp.firstmenu/additions" style ="push" toolbarPath ="additions" tooltip ="绘制矩形" /> <action class ="hellorcp.canvas.DrawGradientAction" icon ="icons/alt_window_16.gif" id ="hellorcp.canvas.DrawGradientAction" label ="绘制渐变矩形" menubarPath ="hellorcp.firstmenu/additions" style ="push" toolbarPath ="additions" tooltip ="绘制渐变矩形" /> <action class ="hellorcp.canvas.DrawImageAction" icon ="icons/alt_window_16.gif" id ="hellorcp.canvas.DrawImageAction" label ="绘制图片" menubarPath ="hellorcp.firstmenu/additions" style ="push" toolbarPath ="additions" tooltip ="绘制图片" />
5) 保存,运行,效果如下:
7. 添加Paint事件的监听器(解决窗口最小化或者被别的窗口遮挡后,图形就会消失的问题),修改后的 CanvasView:
package hellorcp.canvas;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
public class CanvasView extends ViewPart {
public Canvas canvas;
@Override
public void createPartControl(Composite parent) {
// TODO 自动生成方法存根
canvas = new Canvas(parent, SWT.NONE);
// 增加Paint监听器,避免窗口变化后绘图消失
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
// 画椭圆
e.gc.drawOval(80, 50, 100, 100);
// 画矩形
e.gc.drawRectangle(280, 50, 100, 100);
// 画渐变矩形
e.gc.setBackground(PlatformUI.getWorkbench().getDisplay()
.getSystemColor(SWT.COLOR_BLUE));
e.gc.fillGradientRectangle(80, 200, 100, 100, false);
// 画图形
Image img = new Image(PlatformUI.getWorkbench().getDisplay(),
"E:\\develop\\RCP\\HelloRCP\\splash.bmp");
e.gc.drawImage(img, 280, 200);
}
});
}
@Override
public void setFocus() {
// TODO 自动生成方法存根
}
}