JFace的TableViewer中,通过方法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中已经提供了用于dialog的celleditor类:
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);
由上述步骤,简易的参照功能就已经能够实现了,并保证了良好的扩展性(本功能的扩展性是建立在本程序需求的基础之上,没有通用参考价值)。
相关推荐
SWT/JFace 的形成是为了解决传统 GUI 开发中的一些问题,如:平台相关性、难以使用、性能不佳等问题。SWT/JFace 的出现,提供了一种新的 GUI 开发方式,使开发者能够快速构建高效、美观的 GUI 应用程序。 SWT/JFace...
SWT (Standard Widget Toolkit) 和 JFace 是两个在Java中用于构建图形用户界面(GUI)的重要库,尤其在开发Eclipse插件时被广泛应用。它们是开源项目,由Eclipse基金会维护,为开发者提供了丰富的控件和高级UI设计...
3. `org.eclipse.jface_3.3.1.M20070910-0800b.jar`:JFace的主要库,包含了诸如对话框、表视图、字段编辑器等高级UI组件的实现。 4. `org.eclipse.core.commands_3.3.0.I20070605-0010.jar`:提供命令框架,使得...
8. **Layout Managers**:SWT 提供了多种布局管理器,如 FillLayout、GridLayout、FormLayout 等,用于控制组件在容器中的排列方式。 9. **Action and Menu Support**:SWT/Jface 提供了对菜单、工具栏和快捷键的...
SWT/Jface开发入门指南是一篇专为初学者编写的教程,旨在帮助他们快速搭建开发环境并掌握使用SWT和JFace编写图形化应用程序的基本技巧。以下是该教程所涵盖的关键知识点: 1. **SWT和JFace简介**: - SWT全称...
SWT (Standard Widget Toolkit) 和 JFace 是 Eclipse 开发框架中的两个重要组件,它们主要用于构建图形用户界面(GUI)。SWT 是一个底层的 GUI 工具包,它提供了与操作系统直接交互的能力,使得应用程序能够拥有原生...
Eclipse SWT/JFace 核心应用 带书签 Eclipse SWT/JFace
SWT/JFace开发实例
2. **JFace组件**:JFace的源码可能包含对话框、视图、表和树的实现,以及数据模型和控制器的类。 3. **事件和监听器**:SWT和JFace都依赖于事件驱动的编程模型,源码中会有大量的事件接口和监听器类。 4. **布局...
Eclipse SWT/JFace是Eclipse框架中的两个关键组件,它们为构建用户界面提供了强大的支持。SWT(Standard Widget Toolkit)是Eclipse的本机GUI库,而JFace是基于SWT构建的更高层次的抽象层,它简化了UI开发过程。 ...
JFace包括诸如视图、编辑器、对话框、表和树等组件,以及事件处理机制,使开发者能更专注于业务逻辑而不是界面细节。 《SWT/JFace in Action》这本书是这两项技术的权威指南,它包含了详细的教程和实例,帮助读者...
6. **表单和编辑器**:如何利用JFace构建功能丰富的表单,以及创建可编辑的数据视图。 7. **视图和工作台管理**:学习如何在Eclipse RCP(Rich Client Platform)环境中添加、管理和组织视图。 8. **案例分析**:...
在实际开发中,开发者还会遇到Composite(组合组件)、Button、Text、List、Tree、Table等SWT组件,以及Dialogs、Layouts等高级功能。同时,JFace的View、Part、Action等概念用于构建更复杂的RCP应用程序。通过深入...
JFace 是建立在SWT之上的一个抽象层,它提供了一些高级服务,如数据绑定、视图和对话框的构建器,以及模型-视图-控制器(MVC)的设计模式,这使得开发者可以更专注于业务逻辑,而不是GUI的细节。JFace还引入了视图、...
SWT (Standard Widget Toolkit) 和 JFace 是两个用于构建Java图形用户界面(GUI)的开源库,它们在Java开发领域中被广泛使用,特别是在Eclipse IDE及其插件开发中。SWT是底层的UI库,提供了与操作系统原生控件直接...
Eclipse SWT(Standard Widget Toolkit)和JFace是Java开发中用于构建桌面应用程序的两个关键库。它们都是Eclipse IDE的一部分,提供了丰富的用户界面组件和高级功能,帮助开发者创建美观、高效的图形用户界面(GUI...
### SWT/JFace中文教程知识点详解 #### 1.1 SWT/JFace概览 - **SWT与JFace的目的**:SWT(Standard Widget Toolkit)和JFace是Eclipse平台提供的两个核心工具包,用于构建高性能的图形用户界面(GUI)。SWT主要...
9. **视图和编辑器**:在Eclipse RCP(Rich Client Platform)应用中,JFace提供了视图(View)和编辑器(Editor)的概念,它们是用户界面的主要组成部分。 10. **模型-视图-控制器(MVC)**:JFace鼓励使用MVC模式...
Eclipse SWT(Standard Widget Toolkit)和JFace是用于构建Java GUI应用程序的强大工具,它们与Eclipse IDE紧密集成,提供了一套丰富的控件和抽象层,使得开发者能够创建出功能丰富的桌面应用。本压缩包包含的"全部...