第11章 树和列表设计
- 格式:pdf
- 大小:1.16 MB
- 文档页数:111
第11章树与列表设计主讲教师:程细柱 韶关学院计算机系本书主编:赵满来 清华大学出版社11.1 JFace程序入门JFace组件对SWT的一些相关组件做了封装,使GUI程序的设计更为简洁和方便。
主要包括:(1)提供了察看器(viewer)类以处理对组件进行集合、归类、过滤和更新这种冗长乏味的工作。
(2)提供了动作(Actions)以便在程序中定义常用的操作并赋给特定的组件,从而简化菜单项、工具项和按钮等事件处理的设计。
(3)提供了注册表(registries)对有限的系统资源进行高效地集中管理。
程序中把经常使用的图片和字体等放到注册表中既节约了系统资源,又提高了程序运行效率。
(4)定义了标准对话框(dialogs)和向导(wizards),并且定义了一个用于构建复杂用户交互界面的框架。
11.1.1 JFace GUI程序的结构ApplicationWindowCompositeCompositeWidget Widget Widget顶级应用程序窗口createContents参数parent createContents中创建的,如new UserLoginComposite (parent,SWT.NONE)•JFace的程序窗口是:org.eclipse.jface.window.ApplicationWi ndow类的实例,内建对菜单、工具栏和状态条等窗口部件的支持。
•在窗口中显示了一些特定的组件,添加这些组件的方法是:protected ControlcreateContents(Composite parent)创建一个JFace窗口应用程序的步骤:•第一步:创建一个ApplicationWindow类的实例。
•第二步:如果程序中包括多个窗口,如除了主窗口外还有对话框,则为新建窗口指定一个窗口管理器。
•第三步:对新建窗口对象调用 public void setBlockOnOpen(boolean shouldBlock)方法,传递true作为参数。
之后调用open方法(public int open() )打开窗口。
•第四步:关闭当前程序的Display对象,以便释放系统资源:Display.getCurrent().dispose();JFace实例:改写例9.3文件阅读程序•例11.1 功能:设计一个JFace窗口式文件阅读程序。
•设计方法:1)界面设计:使用可视化方法创建一个类名为ReadFileComposite的Composite面板,并在其中添加SashForm、Label、Combo组件,如图:2)新建z11ReadFileJFace类继承ApplicationWindow类,包括main方法和ReadFileV4(Shell)构造方法,代码如下: public class z11ReadFileJFace extends ApplicationWindow {private static ReadFileComposite rfc;public z11ReadFileJFace(Shell parentShell) {super(parentShell);}public static void main(String[] args) {z11ReadFileJFace readerFile = newz11ReadFileJFace(null);readerFile.setBlockOnOpen(true);readerFile.open();Display.getCurrent().dispose();}........ }3)重写z11ReadFileJFace类中的createContents方法:protected Control createContents(Composite parent) { parent.getShell().setText("JFace实例:简易文件阅读器");parent.getShell().setImage(new Image (Display.getCurrent(), getClass(). getResourceAsStream("/icons/sgu_32X32.ico")));parent.getShell().setSize(800, 600);rfc = new ReadFileComposite(parent,SWT.NONE); return rfc;}•程序运行结果如下:11.1.2 JFace的Action•在JFace中提供了IAction 接口及其实现类org.eclipse.jface.action.Action,应用程序通过编写它们的子类,实现public void run( )方法为具体命令提供需要的功能。
•Action子类的一个实例就是可以被终端用户触发的命令,典型情况下与按钮、菜单项和工具项相关联,当终端用户通过相关组件触发该命令时,调用Action中的run方法执行实际操作。
•引发事件的单独GUI组件就是所谓的ContributionItem,如工具栏的工具项按钮。
•通常ContributionManager管理ContributionItem,包装了工具栏、菜单等可以放置操作的组件。
•当开发者将一个ContributionItem添加到ContributionManager时,ContributionManager 会从ContributionItem中取得对应操作的显示信息,并生成一个新的组件(工具栏按钮、菜单项等)显示在界面上。
•ContributionItem和ContributionManager的接口与实现类JFace实例:完善例11.1文件阅读程序•例11.2 的功能:为例11.1设计的JFace阅读程序添加菜单、工具栏和有关事件处理功能。
•说明:该程序主要操作包括打开文件、打印文件、关闭文件、设置字体、设置背景颜色和退出程序6项功能,这些功能需要以菜单项和工具项两种方式提供给用户。
为此,将前3项和最后一项组织在文件菜单中,设置字体和背景颜色组织在格式菜单中。
这6种功能也都在工具栏给出。
•程序的运行界面如下:•程序的运行结果如下:•设计方法:1)分别针对每一个功能编写一个Action子类FileOpen、FilePrint、FileClose、FormatFont、FormatBGColor和FileQuit。
如FileOpen的代码如下:public class FileOpen extends Action {private ReadFileComposite rfc = null ;private static BufferedReader bfr;private static FileReader fr;public FileOpen() {super();this.setText("打开(&O)@Ctrl+O");this.setImageDescriptor(ImageDescriptor.cre ateFromFile(this.getClass(), "/icons/open.JPG")); }public void run() {super.run();this.rfc = z11ReadFileJFace.getRfc() ;FileDialog fd = new FileDialog(rfc.getShell());String filesName = fd.open();if(filesName!=null &&filesName.toLowerCase().endsWith(".txt")) { File readFile = new File(filesName);try {rfc.getTextArea().setText("") ;fr = new FileReader(readFile);bfr = new BufferedReader(fr);String content = bfr.readLine() ;while(content!=null) {rfc.getTextArea(). append (content+"\r\n");content = bfr.readLine() ;}}catch (FileNotFoundException e1) { e1.printStackTrace();} catch (IOException e2) {e2.printStackTrace();}} else {unch(filesName);}}public static BufferedReader getBfr() { return bfr;}public static FileReader getFr() {return fr;}}2)修改主类z11ReadFileJFace的构造方法、重写createMenuManager和createToolBarManager 方法,代码如下:public class z11ReadFileJFace extends ApplicationWindow {private static ReadFileComposite rfc;private FileOpen fo ;private FileClose fc ;private FilePrint fp ;private FileQuit fq ;private FormatFont ff ;private FormatBGColor fb;public z11ReadFileJFace(Shell parentShell) { super(parentShell);fo = new FileOpen();fc = new FileClose();fp = new FilePrint(this.getShell());fq = new FileQuit(this.getShell());ff = new FormatFont(this.getShell());fb = new FormatBGColor(this.getShell());addMenuBar();addToolBar(SWT.FLAT | SWT.WRAP);}public static void main(String[] args) { z11ReadFileJFace readerFile = newz11ReadFileJFace(null);readerFile.setBlockOnOpen(true);readerFile.open();Display.getCurrent().dispose();}public static ReadFileComposite getRfc() { return rfc;}protected Control createContents(Composite parent) {parent.getShell().setText("JFace实例:简易文件阅读器");parent.getShell().setImage(new Image (Display.getCurrent(), getClass(). getResourceAsStream("/icons/sgu_32X32.ic o")));parent.getShell().setSize(800, 600);rfc = new ReadFileComposite (parent,SWT.NONE);return rfc;}protected MenuManager createMenuManager() { MenuManager menuBar = new MenuManager();MenuManager fileMenu = new MenuManager("文件(&F)");fileMenu.add(fo);fileMenu.add(fp);fileMenu.add(fc);fileMenu.add(fq);MenuManager formatMenu = new MenuManager("格式(&V)");formatMenu.add(ff);formatMenu.add(fb);menuBar.add(fileMenu);menuBar.add(formatMenu);return menuBar;}protected ToolBarManager createToolBarManager (int style) {ToolBarManager toolBar =new ToolBarManager();toolBar.add(fo);toolBar.add(fb);toolBar.add(ff);toolBar.add(fp);toolBar.add(fc);toolBar.add(fq);return toolBar;}}3)沿用例9.3实现的其它功能,如对文件夹输入、在列表项和在文本框双击鼠标的事件处理。