本人用JFace,调用SourceViewer,然后建立了rule,添加事件,双击就在rule上绘图,但是当在SourceViewer里面输入任意符号和问题(包括空格和回车键),那么我前面的绘图操作就被系统自动覆盖了……其实只是想做到eclipse断点的模式,在rule上添加一个小图标而已……代码如下:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.source.AnnotationRulerColumn;
import org.eclipse.jface.text.source.CompositeRuler;
import org.eclipse.jface.text.source.LineNumberRulerColumn;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
//import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;public class Jfacetest extends ApplicationWindow { private StyledText styledText;
private AnnotationRulerColumn annotationRulerColumn;
@SuppressWarnings("unchecked")
private Map lineImage = new HashMap();
private Image image = null;
private int y = 0;
@SuppressWarnings("unchecked")
private List list = null;
/**
* Create the application window
*/
public Jfacetest() {
super(null);
createActions();
addToolBar(SWT.FLAT | SWT.WRAP);
addMenuBar();
addStatusLine();
} /**
* Create contents of the application window
* @param parent
*/
@Override
protected Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
// container.setBounds(0, 0, 483, 144);
Document doc = new Document("");
final CompositeRuler ruler= new CompositeRuler();//创建一个标尺ruler
annotationRulerColumn = new AnnotationRulerColumn(12);
ruler.addDecorator(0, annotationRulerColumn);
ruler.addDecorator(1, new LineNumberRulerColumn());//为这个标尺添加行号显示
final SourceViewer sourceViewer = new SourceViewer(container, ruler, SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.H_SCROLL);
sourceViewer.setDocument(doc);
sourceViewer.setEditable(true);
styledText = sourceViewer.getTextWidget();
styledText.setBounds(0, 0, 483, 144); final Control rulerControl = ruler.getControl();
rulerControl.addMouseListener(new MouseAdapter() {
@SuppressWarnings("unchecked")
public void mouseDoubleClick(final MouseEvent e) {
final GC gc= new GC(annotationRulerColumn.getControl());
image =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/breakpoint.gif");
Image image1 =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/annotationRuler.gif");
int line = ruler.getLineOfLastMouseButtonActivity();
if(lineImage.get(line)!=null){
int dely = styledText.getLineHeight()*line+1;
gc.drawImage(image1, 1, dely);
lineImage.remove(line);
}else{
lineImage.put(line, line);
}
Set set = lineImage.keySet();
list = new LinkedList(set);
for(int i=0;i<lineImage.size();i++){
Integer linei = (Integer) list.get(i);
y = styledText.getLineHeight()*linei+1;//根据当前鼠标点击行和输入框行高计算出绘画的y坐标
gc.drawImage(image, 1, y);
System.out.println("行号:"+line+";y:"+y);
}
image1.dispose();
}
}); annotationRulerColumn.getControl().addPaintListener(new PaintListener(){
public void paintControl(PaintEvent painte){
image =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/breakpoint.gif");
for(int i=0;i<lineImage.size();i++){
Integer linei = (Integer) list.get(i);
y = styledText.getLineHeight()*linei+1;//根据当前鼠标点击行和输入框行高计算出绘画的y坐标
painte.gc.drawImage(image, 1, y);
}
painte.gc.dispose();
}
});
// sourceViewer.addPostSelectionChangedListener(new SelectionChanged(){
// public void selectionChanged(SelectionChangedEvent event){
// }
// });// final Button button = new Button(container, SWT.NONE);
// button.addMouseListener(new MouseAdapter() {
// public void mouseDown(final MouseEvent e) {
// System.out.println(styledText.getText());
// }
// });
// button.setText("button");
//
return container;
}
/**
* Create the actions
*/
private void createActions() {
// Create the actions
} /**
* Create the menu manager
* @return the menu manager
*/
@Override
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager("menu");
return menuManager;
} /**
* Create the toolbar manager
* @return the toolbar manager
*/
@Override
protected ToolBarManager createToolBarManager(int style) {
ToolBarManager toolBarManager = new ToolBarManager(style);
return toolBarManager;
} /**
* Create the status line manager
* @return the status line manager
*/
@Override
protected StatusLineManager createStatusLineManager() {
StatusLineManager statusLineManager = new StatusLineManager();
statusLineManager.setMessage(null, "");
return statusLineManager;
} /**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
Jfacetest window = new Jfacetest();
window.setBlockOnOpen(true);
window.open();
Display.getCurrent().dispose();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* Configure the shell
* @param newShell
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("SourceText测试和Rule测试");
} /**
* Return the initial size of the window
*/
@Override
protected Point getInitialSize() {
return new Point(500, 371);
}}
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.source.AnnotationRulerColumn;
import org.eclipse.jface.text.source.CompositeRuler;
import org.eclipse.jface.text.source.LineNumberRulerColumn;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
//import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;public class Jfacetest extends ApplicationWindow { private StyledText styledText;
private AnnotationRulerColumn annotationRulerColumn;
@SuppressWarnings("unchecked")
private Map lineImage = new HashMap();
private Image image = null;
private int y = 0;
@SuppressWarnings("unchecked")
private List list = null;
/**
* Create the application window
*/
public Jfacetest() {
super(null);
createActions();
addToolBar(SWT.FLAT | SWT.WRAP);
addMenuBar();
addStatusLine();
} /**
* Create contents of the application window
* @param parent
*/
@Override
protected Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
// container.setBounds(0, 0, 483, 144);
Document doc = new Document("");
final CompositeRuler ruler= new CompositeRuler();//创建一个标尺ruler
annotationRulerColumn = new AnnotationRulerColumn(12);
ruler.addDecorator(0, annotationRulerColumn);
ruler.addDecorator(1, new LineNumberRulerColumn());//为这个标尺添加行号显示
final SourceViewer sourceViewer = new SourceViewer(container, ruler, SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.H_SCROLL);
sourceViewer.setDocument(doc);
sourceViewer.setEditable(true);
styledText = sourceViewer.getTextWidget();
styledText.setBounds(0, 0, 483, 144); final Control rulerControl = ruler.getControl();
rulerControl.addMouseListener(new MouseAdapter() {
@SuppressWarnings("unchecked")
public void mouseDoubleClick(final MouseEvent e) {
final GC gc= new GC(annotationRulerColumn.getControl());
image =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/breakpoint.gif");
Image image1 =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/annotationRuler.gif");
int line = ruler.getLineOfLastMouseButtonActivity();
if(lineImage.get(line)!=null){
int dely = styledText.getLineHeight()*line+1;
gc.drawImage(image1, 1, dely);
lineImage.remove(line);
}else{
lineImage.put(line, line);
}
Set set = lineImage.keySet();
list = new LinkedList(set);
for(int i=0;i<lineImage.size();i++){
Integer linei = (Integer) list.get(i);
y = styledText.getLineHeight()*linei+1;//根据当前鼠标点击行和输入框行高计算出绘画的y坐标
gc.drawImage(image, 1, y);
System.out.println("行号:"+line+";y:"+y);
}
image1.dispose();
}
}); annotationRulerColumn.getControl().addPaintListener(new PaintListener(){
public void paintControl(PaintEvent painte){
image =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/breakpoint.gif");
for(int i=0;i<lineImage.size();i++){
Integer linei = (Integer) list.get(i);
y = styledText.getLineHeight()*linei+1;//根据当前鼠标点击行和输入框行高计算出绘画的y坐标
painte.gc.drawImage(image, 1, y);
}
painte.gc.dispose();
}
});
// sourceViewer.addPostSelectionChangedListener(new SelectionChanged(){
// public void selectionChanged(SelectionChangedEvent event){
// }
// });// final Button button = new Button(container, SWT.NONE);
// button.addMouseListener(new MouseAdapter() {
// public void mouseDown(final MouseEvent e) {
// System.out.println(styledText.getText());
// }
// });
// button.setText("button");
//
return container;
}
/**
* Create the actions
*/
private void createActions() {
// Create the actions
} /**
* Create the menu manager
* @return the menu manager
*/
@Override
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager("menu");
return menuManager;
} /**
* Create the toolbar manager
* @return the toolbar manager
*/
@Override
protected ToolBarManager createToolBarManager(int style) {
ToolBarManager toolBarManager = new ToolBarManager(style);
return toolBarManager;
} /**
* Create the status line manager
* @return the status line manager
*/
@Override
protected StatusLineManager createStatusLineManager() {
StatusLineManager statusLineManager = new StatusLineManager();
statusLineManager.setMessage(null, "");
return statusLineManager;
} /**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
Jfacetest window = new Jfacetest();
window.setBlockOnOpen(true);
window.open();
Display.getCurrent().dispose();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* Configure the shell
* @param newShell
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("SourceText测试和Rule测试");
} /**
* Return the initial size of the window
*/
@Override
protected Point getInitialSize() {
return new Point(500, 371);
}}
解决方案 »
- 有10万个用户的信息存储在文本文件,如何将重复的信息排除掉,给出解决的方法(至少2种)
- 求救!!生成javadoc出错,期待高手
- 窗口刷新时,怎么才能保留repaint()中画的东西呢?
- 求思路:要把随机生成的数字保存起来,要求不能有重复的数字.
- 如何用本地JAVA程序检测路由器和集线器流量?
- 请问java中如何获得windows的系统目录?
- 关于取组件的大小的问题,请教高手
- 想用java做一个数据库应用程序
- 为什么我不会配置JDK?帮帮忙
- 调查!!!在公司里JAVA到底用来做什么项目???薪水何?
- 如何写main函数.
- 因为工作需要,现在需要学习java,曾经自学C#,现在想请教大家该如何开展学习呢!
PS:问题很早就解决了,对SourceViewer的paint事件进行重写……