`
brandNewUser
  • 浏览: 455937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SWT/JFace中Table相同列多种类型CellEditor以及参照类型编辑器的实现

阅读更多

 

JFaceTableViewer中,通过方法TableViewer.setCellEditors(…)方法可以设置每一列对应的CellEditor。但是如果这样做的话,就会导致无法根据当前行的信息来设置不同的CellEditor,这里介绍一种可以根据不同行设置同一列对应的CellEditor: EditingSupport

 

TableColumn paramNameColumn = new TableColumn(table, SWT.NONE);
paramNameColumn.setWidth(350);
paramNameColumn.setText("参数名");
TableColumn paramValueColumn = new TableColumn(table, SWT.NONE);
paramValueColumn.setWidth(400);
paramValueColumn.setText("参数值");
 
commonParamTableViewer.setColumnProperties(COMMON_PARAM_TITLE);
CellEditor[] cellEditors = new CellEditor[COMMON_PARAM_TITLE.length];
commonParamTableViewer.setCellEditors(cellEditors);
      
TableViewerColumn paramNameViewerColumn = new TableViewerColumn(commonParamTableViewer, paramNameColumn);
paramNameViewerColumn.setEditingSupport(new EmptyEditingSupport(commonParamTableViewer));
      
TableViewerColumn paramValueViewerColumn = new TableViewerColumn(commonParamTableViewer, paramValueColumn);
paramValueViewerColumn.setEditingSupport(new ConfigurableEditingSupport(commonParamTableViewer, ruleEditorListener));

      

而对于EditingSupport有哪些方法?顾名思义,EditingSupport就是为了能够提供编辑支持,该字段能否编辑(canEdit),编辑时得到的值(getValue),编辑后设置的值(setValue),以及使用哪种编辑器(CellEditor)

 

于是在getCellEditor方法中,就可以根据当前行值(方法中的参数element)设置对应不同的CellEditor

 

对于特殊的参照式的Editor(如下图),在单击按钮时弹出对话框(对话框的内容自定义),是如何实现的?

 

 

 

eclipse中已经提供了用于dialogcelleditor类:

org.eclipse.jface.viewers.DialogCellEditor

  

我们可以直接从这点入手,进行扩展,其中的openDialogBox方法就是建立弹出对话框中的内容面板,用户可以在上面进行编辑,并得到返回值结果,这里我们在该方法中直接打开一个RefPaneDialog用于打开对应的对话框。

 

@Override
   protected Object openDialogBox(Control cellEditorWindow) {
      if (dialogComposite == null) {
         MessageDialog.openError(cellEditorWindow.getShell(), "", "");
         returnnull;
      }
      // textEditorChanged = false;
      dialog = new RefPaneDialog(cellEditorWindow.getShell(), valueObj, dialogComposite);
      int result = dialog.open();
      if(result == IDialogConstants.OK_ID) {
         valueObj = dialogComposite.getResultValue();
         // if(valueObj != null){
         text.setText(valueObj == null ? "" : dialogComposite.getDisplayText(valueObj));
         text.setFocus();
      }
      // }
      returnvalueObj;
   }

 

    

而对于对话框中的内容,这里采用了策略模式,交给具体的IDialogComposite来扩展,其中的主要方法和说明如下:

package com.yonyou.nc.codevalidator.runtime.plugin.celleditor;

import java.util.List;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * 参照对话框中用于定义的界面处理接口,其中包括显示数据,获取最终结果值操作等
 * @author mazqa
 *
 */
public interface IDialogComposite {
	
	/**
	 * 创建对话框界面Area
	 * @param parent
	 * @param value
	 * @return
	 */
	public void createDialogArea(final Composite parent, Object value);
	
	/**
	 * 创建对话框内容方法,可以更改对话框的大小和显示标题
	 * @param parent
	 * @param value
	 * @return
	 */
	public void createContents(final Control parent, Object value);
	
	/**
	 * 得到对话框中显示的按钮
	 * @return
	 */
	public List<DialogButtonObj> getDialogButtons();
	
	/**
	 * 对按钮事件的处理方法
	 * @param buttonId
	 */
	public void buttonPressed(int buttonId);
	
	/**
	 * 获取最终的返回结果对象, 如果不是同一个对象,最好返回序列化复制后的对象,
	 * 以便能够在编辑完成后进行刷新
	 * @return
	 */
	public Object getResultValue();
	
	/**
	 * 在参照编辑状态中显示在左侧text中的值
	 * @param value
	 * @return
	 */
	public String getDisplayText(Object value);
	
	/**
	 * 从参照的text获得Object值,
	 * @param textValue
	 * @return
	 * @throws Exception 转换失败,格式不正确时
	 */
	public Object getObjectFromText(String textValue) throws Exception;
	
	/**
	 * 参照前面的文本框是否可用,如果不可用{@link #getObjectFromText(String)}方法也不会被调用到
	 * @return
	 */
	public boolean isTextEnable();
	
	/**
	 * 参照非编辑状态显示的值
	 * @param value
	 * @return
	 */
	public String getDisplayLabel(Object value);
	
	/**
	 * 得到TitleAreaDialog中的标题内容
	 * @return
	 */
	public String getTitle();
	
	/**
	 * 得到TitleAreaDialog中的描述内容
	 * @return
	 */
	public String getDescription();
	
	/**
	 * 显示在dialog中的button对象
	 * @author mazqa
	 *
	 */
	public static class DialogButtonObj{
		int id;
		String name;
		boolean defaultButton;
		public DialogButtonObj(int id, String name, boolean defaultButton) {
			super();
			this.id = id;
			this.name = name;
			this.defaultButton = defaultButton;
		}
		public int getId() {
			return id;
		}
		public String getName() {
			return name;
		}
		public boolean isDefaultButton() {
			return defaultButton;
		}
		
	}
}

 

 

RefPaneDialog对话框直接继承自org.eclipse.jface.dialogs.TitleAreaDialog,其中的所有创建按钮,面板,以及操作的方法都是委托对应的IDialogComposite实现的。

 

在创建对话框的过程中,加入了显示在屏幕中央的处理逻辑:

     createActualContents(parent, value);
     Rectangle displayBounds = Display.getCurrent().getPrimaryMonitor().getBounds();
      Rectangle shellBounds = parent.getShell().getBounds();
      int x = displayBounds.x + (displayBounds.width - shellBounds.width) >> 1;
      int y = displayBounds.y + (displayBounds.height - shellBounds.height) >> 1;
      parent.getShell().setLocation(x, y);

  

由上述步骤,简易的参照功能就已经能够实现了,并保证了良好的扩展性(本功能的扩展性是建立在本程序需求的基础之上,没有通用参考价值)。

 

 

  • 大小: 31.5 KB
分享到:
评论

相关推荐

    swt/jface中文教程

    SWT/JFace 的形成是为了解决传统 GUI 开发中的一些问题,如:平台相关性、难以使用、性能不佳等问题。SWT/JFace 的出现,提供了一种新的 GUI 开发方式,使开发者能够快速构建高效、美观的 GUI 应用程序。 SWT/JFace...

    SWT/JFace专题 --- SWT/JFace概述

    SWT (Standard Widget Toolkit) 和 JFace 是两个在Java中用于构建图形用户界面(GUI)的重要库,尤其在开发Eclipse插件时被广泛应用。它们是开源项目,由Eclipse基金会维护,为开发者提供了丰富的控件和高级UI设计...

    swt/jface.jar

    3. `org.eclipse.jface_3.3.1.M20070910-0800b.jar`:JFace的主要库,包含了诸如对话框、表视图、字段编辑器等高级UI组件的实现。 4. `org.eclipse.core.commands_3.3.0.I20070605-0010.jar`:提供命令框架,使得...

    SWT/Jface API 3.4

    8. **Layout Managers**:SWT 提供了多种布局管理器,如 FillLayout、GridLayout、FormLayout 等,用于控制组件在容器中的排列方式。 9. **Action and Menu Support**:SWT/Jface 提供了对菜单、工具栏和快捷键的...

    SWT/JFACE客户端登录窗口例子

    SWT (Standard Widget Toolkit) 和 JFace 是 Eclipse 开发框架中的两个重要组件,它们主要用于构建图形用户界面(GUI)。SWT 是一个底层的 GUI 工具包,它提供了与操作系统直接交互的能力,使得应用程序能够拥有原生...

    Eclipse SWT/JFace 核心应用 带书签

    Eclipse SWT/JFace 核心应用 带书签 Eclipse SWT/JFace

    SWT/JFace开发实例

    SWT/JFace开发实例

    Eclipse SWT/JFace 核心应用光盘源码

    2. **JFace组件**:JFace的源码可能包含对话框、视图、表和树的实现,以及数据模型和控制器的类。 3. **事件和监听器**:SWT和JFace都依赖于事件驱动的编程模型,源码中会有大量的事件接口和监听器类。 4. **布局...

    eclipse swt/jface核心应用源码

    Eclipse SWT/JFace是Eclipse框架中的两个关键组件,它们为构建用户界面提供了强大的支持。SWT(Standard Widget Toolkit)是Eclipse的本机GUI库,而JFace是基于SWT构建的更高层次的抽象层,它简化了UI开发过程。 ...

    swt/jface in action +中文版+英文版+源码 下载

    JFace包括诸如视图、编辑器、对话框、表和树等组件,以及事件处理机制,使开发者能更专注于业务逻辑而不是界面细节。 《SWT/JFace in Action》这本书是这两项技术的权威指南,它包含了详细的教程和实例,帮助读者...

    swt/jface实例开发

    6. **表单和编辑器**:如何利用JFace构建功能丰富的表单,以及创建可编辑的数据视图。 7. **视图和工作台管理**:学习如何在Eclipse RCP(Rich Client Platform)环境中添加、管理和组织视图。 8. **案例分析**:...

    SWT/JFace学习文档

    在实际开发中,开发者还会遇到Composite(组合组件)、Button、Text、List、Tree、Table等SWT组件,以及Dialogs、Layouts等高级功能。同时,JFace的View、Part、Action等概念用于构建更复杂的RCP应用程序。通过深入...

    Eclipse swt/jface核心应用源码(带视频)

    JFace 是建立在SWT之上的一个抽象层,它提供了一些高级服务,如数据绑定、视图和对话框的构建器,以及模型-视图-控制器(MVC)的设计模式,这使得开发者可以更专注于业务逻辑,而不是GUI的细节。JFace还引入了视图、...

    SWT/JFACE API

    SWT (Standard Widget Toolkit) 和 JFace 是两个用于构建Java图形用户界面(GUI)的开源库,它们在Java开发领域中被广泛使用,特别是在Eclipse IDE及其插件开发中。SWT是底层的UI库,提供了与操作系统原生控件直接...

    Eclipse SWT/JFace 核心应用

    Eclipse SWT(Standard Widget Toolkit)和JFace是Java开发中用于构建桌面应用程序的两个关键库。它们都是Eclipse IDE的一部分,提供了丰富的用户界面组件和高级功能,帮助开发者创建美观、高效的图形用户界面(GUI...

    swt/Jface中文教程

    ### SWT/JFace中文教程知识点详解 #### 1.1 SWT/JFace概览 - **SWT与JFace的目的**:SWT(Standard Widget Toolkit)和JFace是Eclipse平台提供的两个核心工具包,用于构建高性能的图形用户界面(GUI)。SWT主要...

    swt/jface api帮助文档

    9. **视图和编辑器**:在Eclipse RCP(Rich Client Platform)应用中,JFace提供了视图(View)和编辑器(Editor)的概念,它们是用户界面的主要组成部分。 10. **模型-视图-控制器(MVC)**:JFace鼓励使用MVC模式...

    Eclipse SWT/JFace 书中 全部实例

    Eclipse SWT(Standard Widget Toolkit)和JFace是用于构建Java GUI应用程序的强大工具,它们与Eclipse IDE紧密集成,提供了一套丰富的控件和抽象层,使得开发者能够创建出功能丰富的桌面应用。本压缩包包含的"全部...

    SWT/JFace从入门到精通

    JFace的主要组件包括视图(View)、编辑器(Editor)、对话框(Dialog)以及数据绑定机制。 3. Eclipse IDE与SWT/JFace Eclipse作为一款强大的集成开发环境(IDE),其用户界面大量使用了SWT和JFace。这使得...

Global site tag (gtag.js) - Google Analytics