如何在Draw2d中实现直接编辑框的功能呢?
思路:用一个带有Text的Shell,实现直接编辑框的功能。
关键点:Shell的大小设置(关系到该框的外观);Shell的位置设置(关系到是否达到直接编辑框的效果);
例子代码:
private Shell textshell;//可以定义一个全局变量,保证该编辑框的唯一性 private void createTextShell(String oldTextValue){ Point point = getRealLocation();//关键点1:shell的位置设置----该方法本文后面有说明 if (textshell == null || textshell.isDisposed()) { textshell = new Shell(Display.getCurrent().getActiveShell(), SWT.NONE); } textshell.setLocation(point.x, point.y); textshell.setSize(110, 20); //关键点2:shell的大小和text的大小设置,根据需要设置合适的大小 final Text text = new Text(textshell, SWT.BORDER);//在Shell中定义text text.setSize(110, 18); text.setText(oldTextValue); text.setFont(FontFactory.getFont("Arial", 9, SWT.BOLD));//设置text中的字体,FontFactory是自己定义的类,用户可以定义,这里不讨论 text.setSelection(0, text.getText().length());//设置text的选中字符,比如这里就是全选 text.addFocusListener(new FocusListener(){ @Override public void focusGained(FocusEvent e) { } @Override public void focusLost(FocusEvent e) { //可以在这里,就是失去焦点的时候把合法的值提交 } }); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { //可以在这里对Text框中输入字符的合法性进行判断 } }); textshell.open();//别忘了打开shell } private Point getRealLocation(){//得到编辑框的位置,使得该框正好覆盖在在Draw2d的Figure上,实现直接编辑的功能 Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); int pgx = parentShell.getLocation().x; int pgy = parentShell.getLocation().y;// 1.shell相对于window窗口的坐标。 //利用该pgx,pgy,当移动RCP的窗口时,使得编辑框始终覆盖在对于的Figure上 Point point = getLocation(); //2. getLocation()是Draw2d中Figure类的方法,这里得到的point就是要实现直接编辑功能Figure的位置 FigureCanvas fCanvas = ...//这个是Draw2d的最顶层的Canvas容器,在你自己的项目中找到它,目的是获得滚动条的位置 int xSel = fCanvas.getHorizontalBar().getSelection(); int ySel = fCanvas.getVerticalBar().getSelection(); //3. 滚动条坐标 //xxx,yyy,就是根据自己RCP实际窗口的位置及Figure在整个窗口视图中的位置继续调整的数据,可以自己设置, //直到实现该text刚好覆盖在Figure上面,实现直接编辑的功能 int realx = pgx +point.x - xSel + xxx; int realy = pgy+point.y- ySel + yyy ; point = new Point(realx, realy); return point; }