本文介绍了一个使用ApplicationWindow 和Action 实现的一个文本编辑器。界面美观,基本功能齐全。代码齐全。

首先看 MainWindow.java。

  1. //MainWindow.java
  2. import org.eclipse.jface.action.MenuManager;
  3. import org.eclipse.jface.action.Separator;
  4. import org.eclipse.jface.action.StatusLineManager;
  5. import org.eclipse.jface.window.ApplicationWindow;
  6. import org.eclipse.swt.SWT;
  7. import org.eclipse.swt.events.ModifyEvent;
  8. import org.eclipse.swt.events.ModifyListener;
  9. import org.eclipse.swt.widgets.Composite;
  10. import org.eclipse.swt.widgets.Control;
  11. import org.eclipse.swt.widgets.Display;
  12. import org.eclipse.swt.widgets.Shell;
  13. import org.eclipse.swt.widgets.Text;
  14. public class MainWindow extends ApplicationWindow{
  15. private NewAction newAction;
  16. private OpenAction openAction;
  17. private SaveAction saveAction;
  18. private SaveAsAction saveAsAction;
  19. private ExitAction exitAction;
  20. private CopyAction copyAction;
  21. private CutAction cutAction;
  22. private PasteAction pasteAction;
  23. private HelpAction helpAction;
  24. private FileManager manager;
  25. private Text content;
  26. private static MainWindow app;
  27. private MainWindow(){
  28. super(null);
  29. app = this;
  30. manager = new FileManager();
  31. newAction = new NewAction();
  32. openAction = new OpenAction();
  33. saveAction = new SaveAction();
  34. saveAsAction = new SaveAsAction();
  35. exitAction = new ExitAction();
  36. copyAction = new CopyAction();
  37. cutAction = new CutAction();
  38. pasteAction = new PasteAction();
  39. helpAction = new HelpAction();
  40. this.addMenuBar();
  41. this.addToolBar(SWT.FLAT);
  42. this.addStatusLine();
  43. }
  44. public static MainWindow getApp(){
  45. return app;
  46. }
  47. protected void configureShell(Shell shell){
  48. super.configureShell(shell);
  49. shell.setText("简单写字板");
  50. shell.setMaximized(true);
  51. }
  52. protected Control createContents(Composite parent){
  53. content = new Text(parent, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
  54. content.addModifyListener(new ModifyListener(){
  55. public void modifyText(ModifyEvent e){
  56. manager.setDirty(true);
  57. }
  58. });
  59. return parent;
  60. }
  61. protected MenuManager createMenuManager(){
  62. MenuManager menuBar = new MenuManager();
  63. MenuManager fileMenu = new MenuManager("文件(&F)");
  64. MenuManager editMenu = new MenuManager("编辑(&E)");
  65. MenuManager formatMenu = new MenuManager("格式(&F)");
  66. MenuManager helpMenu = new MenuManager("帮助(&H)");
  67. menuBar.add(fileMenu);
  68. menuBar.add(editMenu);
  69. menuBar.add(formatMenu);
  70. menuBar.add(helpMenu);
  71. fileMenu.add(newAction);
  72. fileMenu.add(openAction);
  73. fileMenu.add(new Separator());
  74. fileMenu.add(saveAction);
  75. fileMenu.add(saveAsAction);
  76. fileMenu.add(new Separator());
  77. fileMenu.add(exitAction);
  78. editMenu.add(copyAction);
  79. editMenu.add(cutAction);
  80. editMenu.add(pasteAction);
  81. formatMenu.add(new FormatAction(FormatAction.TYPE_FONT));
  82. formatMenu.add(new FormatAction(FormatAction.TYPE_BGCOLOR));
  83. formatMenu.add(new FormatAction(FormatAction.TYPE_FORECOLOR));
  84. helpMenu.add(helpAction);
  85. return menuBar;
  86. }
  87. public static void main(String[] args){
  88. MainWindow main = new MainWindow();
  89. main.setBlockOnOpen(true);
  90. main.open();
  91. Display.getCurrent().dispose();
  92. }
  93. public Text getContent(){
  94. return content;
  95. }
  96. public FileManager getManager(){
  97. return manager;
  98. }
  99. public void setManager(FileManager manager){
  100. this.manager = manager;
  101. }
  102. public StatusLineManager getStatusLineManager(){
  103. return super.getStatusLineManager();
  104. }
  105. }

该类继承了 ApplicationWindow。Application 类是应用程序的窗口类,它继承自 Window 类。另外还添加了设置菜单栏、工具栏、状态栏等的方法。createMenuManager 方法用于添加菜单内容。addMenuBar 方法将createMenuManager 创建的菜单添加到窗口。菜单项add 方法添加一个action 对象。Action 对象在run()中实现了具体操作,我们将在后面介绍。除此之外,还需要一个FileManager 来管理打开的文件。

FileManager.java:

  1. //FileManager.java
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.OutputStreamWriter;
  10. import java.io.Reader;
  11. import java.io.Writer;
  12. public class FileManager {
  13. private String fileName;
  14. private boolean dirty = false;
  15. private String content;
  16. public FileManager(){
  17. }
  18. public void load(String name){
  19. final String textString;
  20. try{
  21. File file = new File(name);
  22. FileInputStream stream = new FileInputStream(file.getPath());
  23. Reader in = new BufferedReader(new InputStreamReader(stream));
  24. char[] readBuffer = new char[2048];
  25. StringBuffer buffer = new StringBuffer((int)file.length());
  26. int n;
  27. while((n=in.read(readBuffer))>0){
  28. buffer.append(readBuffer, 0 ,n);
  29. }
  30. textString = buffer.toString();
  31. stream.close();
  32. }catch(FileNotFoundException e){
  33. MainWindow.getApp().getStatusLineManager().setMessage("文件未找到:"+fileName);
  34. return;
  35. }catch(IOException e){
  36. MainWindow.getApp().getStatusLineManager().setMessage("读文件出错: "+fileName);
  37. return;
  38. }
  39. content = textString;
  40. this.fileName= name;
  41. }
  42. public void save(String name){
  43. final String textString = content;
  44. try{
  45. File file = new File(name);
  46. FileOutputStream stream = new FileOutputStream(file.getPath());
  47. Writer out = new OutputStreamWriter(stream);
  48. out.write(textString);
  49. out.flush();
  50. stream.close();
  51. }catch(FileNotFoundException e){
  52. MainWindow.getApp().getStatusLineManager().setMessage("文件未找到:"+fileName);
  53. return;
  54. }catch(IOException e){
  55. MainWindow.getApp().getStatusLineManager().setMessage("读文件出错: "+fileName);
  56. return;
  57. }
  58. }
  59. public String getContent(){
  60. return content;
  61. }
  62. public void setContent(String content){
  63. this.content = content;
  64. }
  65. public boolean isDirty(){
  66. return dirty;
  67. }
  68. public void setDirty(boolean dirty){
  69. this.dirty = dirty;
  70. }
  71. public String getFileName(){
  72. return fileName;
  73. }
  74. public void setFileName(String fileName){
  75. this.fileName = fileName;
  76. }
  77. }

FileManager 类的 load 和 save 方法分别用于加载和保存文件。

用到的一些Action 类如下所示:

CopyAction.java

  1. //CopyAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.SWT;
  5. public class CopyAction extends Action{
  6. public CopyAction(){
  7. super();
  8. setText("复制(&C)");
  9. setToolTipText("复制");
  10. setAccelerator(SWT.CTRL + 'C');
  11. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\copy.gif"));
  12. }
  13. public void run(){
  14. MainWindow.getApp().getContent().copy();
  15. }
  16. }

CutAction.java

  1. //CutAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.SWT;
  5. public class CutAction extends Action{
  6. public CutAction(){
  7. super();
  8. setText("剪切(&C)");
  9. setToolTipText("剪切");
  10. setAccelerator(SWT.CTRL + 'X');
  11. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\cut.gif"));
  12. }
  13. public void run(){
  14. MainWindow.getApp().getContent().cut();
  15. }
  16. }

ExitAction.java

  1. //ExitAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. public class ExitAction extends Action{
  5. public ExitAction(){
  6. super();
  7. setText("退出(&E)");
  8. setToolTipText("退出系统");
  9. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\exit.gif"));
  10. }
  11. public void run(){
  12. MainWindow.getApp().close();
  13. }
  14. }

FormatAction.java

  1. //FormatAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.graphics.Color;
  5. import org.eclipse.swt.graphics.Font;
  6. import org.eclipse.swt.graphics.FontData;
  7. import org.eclipse.swt.graphics.RGB;
  8. import org.eclipse.swt.widgets.ColorDialog;
  9. import org.eclipse.swt.widgets.FontDialog;
  10. import org.eclipse.swt.widgets.Text;
  11. public class FormatAction extends Action{
  12. public static final String TYPE_FORECOLOR = "FORECOLOR";
  13. public static final String TYPE_BGCOLOR = "BGCOLOR";
  14. public static final String TYPE_FONT = "FONT";
  15. private String formatType;
  16. public FormatAction(String type){
  17. super();
  18. this.formatType = type;
  19. initAction();
  20. }
  21. private void initAction(){
  22. if(formatType.equals(TYPE_FONT)){
  23. this.setText("设置字体");
  24. this.setToolTipText("设置字体");
  25. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\font.gif"));
  26. }else if(formatType.equals(TYPE_FORECOLOR)){
  27. this.setText("设置前景色");
  28. this.setToolTipText("设置前景色");
  29. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\foreColor.gif"));
  30. }else{
  31. this.setText("设置背景色");
  32. this.setToolTipText("设置背景色");
  33. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\bgColor.gif"));
  34. }
  35. }
  36. public void run(){
  37. Text content = MainWindow.getApp().getContent();
  38. if(formatType.equals(TYPE_FONT)){
  39. FontDialog fontDialog = new FontDialog(MainWindow.getApp().getShell());
  40. fontDialog.setFontList(content.getFont().getFontData());
  41. FontData fontData = fontDialog.open();
  42. if(fontData != null){
  43. Font font = new Font(MainWindow.getApp().getShell().getDisplay(), fontData);
  44. content.setFont(font);
  45. }
  46. }else if(formatType.equals(TYPE_FORECOLOR)){
  47. ColorDialog colorDialog = new ColorDialog(MainWindow.getApp().getShell());
  48. colorDialog.setRGB(content.getForeground().getRGB());
  49. RGB rgb = colorDialog.open();
  50. if(rgb != null){
  51. Color foregroundColor = new Color(MainWindow.getApp().getShell().getDisplay(), rgb);
  52. content.setForeground(foregroundColor);
  53. foregroundColor.dispose();
  54. }
  55. }else{
  56. ColorDialog colorDialog = new ColorDialog(MainWindow.getApp().getShell());
  57. colorDialog.setRGB(content.getForeground().getRGB());
  58. RGB rgb = colorDialog.open();
  59. if(rgb != null){
  60. Color bgColor = new Color(MainWindow.getApp().getShell().getDisplay(), rgb);
  61. content.setForeground(bgColor);
  62. bgColor.dispose();
  63. }
  64. }
  65. }
  66. }

HelpAction.java

  1. //HelpAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.dialogs.MessageDialog;
  4. import org.eclipse.jface.resource.ImageDescriptor;
  5. public class HelpAction extends Action{
  6. public HelpAction(){
  7. super();
  8. setText("帮助内容(&H)");
  9. setToolTipText("帮助");
  10. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class,"icons/help.gif"));
  11. }
  12. public void run(){
  13. MessageDialog.openInformation(null,"帮助","谢谢使用!");
  14. }
  15. }

NewAction.java

  1. //NewAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.SWT;
  5. public class NewAction extends Action{
  6. public NewAction(){
  7. super();
  8. setText("新建(&N)");
  9. this.setAccelerator(SWT.ALT + SWT.SHIFT + 'N');
  10. setToolTipText("新建");
  11. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\new.gif"));
  12. }
  13. public void run(){
  14. MainWindow.getApp().getContent().setText("");
  15. MainWindow.getApp().setManager(new FileManager());
  16. }
  17. }

OpenAction.java

  1. //OpenAction.java
  2. import java.lang.reflect.InvocationTargetException;
  3. import org.eclipse.core.runtime.IProgressMonitor;
  4. import org.eclipse.jface.action.Action;
  5. import org.eclipse.jface.operation.IRunnableWithProgress;
  6. import org.eclipse.jface.operation.ModalContext;
  7. import org.eclipse.jface.resource.ImageDescriptor;
  8. import org.eclipse.swt.SWT;
  9. import org.eclipse.swt.widgets.FileDialog;
  10. public class OpenAction extends Action{
  11. public OpenAction(){
  12. super();
  13. setText("打开(&O)");
  14. setToolTipText("打开文件");
  15. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\open.gif"));
  16. }
  17. public void run(){
  18. FileDialog dialog = new FileDialog(MainWindow.getApp().getShell(), SWT.OPEN);
  19. dialog.setFilterExtensions(new String[]{"*.java", "*.*"});
  20. final String name = dialog.open();
  21. if((name == null) || (name.length()==0))
  22. return;
  23. final FileManager fileManager = MainWindow.getApp().getManager();
  24. try{
  25. ModalContext.run(new IRunnableWithProgress(){
  26. public void run(IProgressMonitor progressMonitor){
  27. progressMonitor.beginTask("打开文件", IProgressMonitor.UNKNOWN);
  28. fileManager.load(name);
  29. progressMonitor.done();
  30. }
  31. }, true, MainWindow.getApp().getStatusLineManager().getProgressMonitor(),
  32. MainWindow.getApp().getShell().getDisplay());
  33. }catch(InvocationTargetException e){
  34. e.printStackTrace();
  35. }catch(InterruptedException e){
  36. e.printStackTrace();
  37. }
  38. MainWindow.getApp().getContent().setText(fileManager.getContent());
  39. MainWindow.getApp().getStatusLineManager().setMessage("当前打开的文件是: "+name);
  40. }
  41. }

PasteAction.java

  1. //PasteAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.SWT;
  5. public class PasteAction extends Action{
  6. public PasteAction(){
  7. super();
  8. setText("粘贴(&P)");
  9. setToolTipText("粘贴");
  10. setAccelerator(SWT.CTRL + 'V');
  11. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\copy.gif"));
  12. }
  13. public void run(){
  14. MainWindow.getApp().getContent().copy();
  15. }
  16. }

SaveAction.java

  1. //SaveAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.SWT;
  5. import org.eclipse.swt.widgets.FileDialog;
  6. import org.eclipse.swt.widgets.MessageBox;
  7. public class SaveAction extends Action{
  8. public SaveAction(){
  9. super();
  10. setText("保存(&S)");
  11. setToolTipText("保存文件");
  12. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\save.gif"));
  13. }
  14. public void run(){
  15. final FileManager fileManager = MainWindow.getApp().getManager();
  16. if(!fileManager.isDirty())
  17. return;
  18. if(fileManager.getFileName()==null){
  19. FileDialog saveDialog = new FileDialog(MainWindow.getApp().getShell(), SWT.SAVE);
  20. saveDialog.setText("请选择所要保存的文件");
  21. saveDialog.setFilterPath("F:\\");
  22. saveDialog.setFilterExtensions(new String[]{"*.java","*.*"});
  23. String saveFile = saveDialog.open();
  24. if(saveFile != null){
  25. fileManager.setFileName(saveFile);
  26. fileManager.setContent(MainWindow.getApp().getContent().getText());
  27. fileManager.save(fileManager.getFileName());
  28. }
  29. fileManager.setDirty(false);
  30. return;
  31. }
  32. if(fileManager.getFileName()!=null){
  33. MessageBox box = new MessageBox(MainWindow.getApp().getShell(), SWT.ICON_QUESTION | SWT.YES| SWT.NO);
  34. box.setMessage("您确定要保存文件吗?");
  35. int choice = box.open();
  36. if(choice == SWT.NO)
  37. return;
  38. fileManager.setContent(MainWindow.getApp().getContent().getText());
  39. fileManager.save(fileManager.getFileName());
  40. fileManager.setDirty(false);
  41. return;
  42. }
  43. }
  44. }

SaveAsAction.java

  1. //SaveAsAction.java
  2. import org.eclipse.jface.action.Action;
  3. import org.eclipse.jface.resource.ImageDescriptor;
  4. import org.eclipse.swt.SWT;
  5. import org.eclipse.swt.widgets.FileDialog;
  6. public class SaveAsAction extends Action{
  7. public SaveAsAction(){
  8. super();
  9. setText("另存为(&A)");
  10. setToolTipText("另存为");
  11. setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\saveas.gif"));
  12. }
  13. public void run(){
  14. final FileManager fileManager = MainWindow.getApp().getManager();
  15. FileDialog saveDialog = new FileDialog(MainWindow.getApp().getShell(), SWT.SAVE);
  16. saveDialog.setText("请选择所要保存的文件");
  17. saveDialog.setFilterPath("F:\\");
  18. saveDialog.setFilterExtensions(new String[]{"*.java","*.*"});
  19. String saveFile = saveDialog.open();
  20. if(saveFile !=null){
  21. fileManager.setFileName(saveFile);
  22. fileManager.setContent(MainWindow.getApp().getContent().getText());
  23. fileManager.save(fileManager.getFileName());
  24. }
  25. fileManager.setDirty(false);
  26. return;
  27. }
  28. }

以上就是代码部分。

程序运行如下所示:

图标文件存储在项目 bin 目录下的 icons 目录下。所有图标文件都是从org.eclipse.ui_*.jar 中获取的。只是改了一下文件名。

ApplicationWindow的更多相关文章

  1. QML的Window与ApplicationWindow

    ApplicationWindow需要导入QtQuick.Controls Window需要导入QtQuick.Window . 默认不可见,需要设置visible:true才可见. 主要区别就是Ap ...

  2. Qt5.3中qml ApplicationWindow设置窗口无边框问题

    这个版本的qt在这里有点bug.. 设置ApplicationWindow的flags属性为Qt.FramelessWindowHint的确可以使程序无边框,但是同时程序在任务栏的图标也没了. 看文档 ...

  3. JFace下ApplicationWindow关闭窗口时结束进程

    /** * Configure the shell. * @param newShell */ @Override protected void configureShell(Shell newShe ...

  4. 《Qt Quick 4小时入门》学习笔记2

    http://edu.csdn.net/course/detail/1042/14805?auto_start=1   Qt Quick 4小时入门 第五章:Qt Quick基本界面元素介绍   1. ...

  5. 使SWT/JFace支持跨平台

    由于SWT的实现机制,在不同平台下,必须引用不同swt*.jar. 由于这个瓶颈,我们要为不同的平台编译不同的版本.但是这是可以避免的.这将是本文要讨论的内容. 我一共google到了3种soluti ...

  6. 写出形似QML的C++代码

    最开始想出的标题是<Declarative C++ GUI库>,但太标题党了.只写了两行代码,连Demo都算不上,怎么能叫库呢……后来想换掉“库”这个字,但始终找不到合适词来替换.最后还是 ...

  7. qml基础学习 基础概念

    一.概括 学习qt已有2年多的时间,从qt4.7开始使用直到现在正在使用的qt5.6,基本都在windows机器上做开发.最近有意向看了下qt的qml部分,觉着还是挺不错的,毕竟可以做嵌入式移动端产品 ...

  8. 一个QMLListView的例子--

    一般人不知道怎么去过滤ListView里面的数据,下面是一个转载的文章:http://imaginativethinking.ca/use-qt-quicks-delegatemodelgroup/ ...

  9. qml去标题栏

    只要加入"flags: Qt.Window | Qt.FramelessWindowHint "属性就可实现去标题栏. 注意:在使用这个属性的时候要先导入QtQuick.Windo ...

随机推荐

  1. 关于SAP的事务提交和回滚(LUW)

    1 Sap的更新的类型 在sap中,可以使用CALL FUNCTION ... IN UPDATE TASK将多个数据更新绑定到一个database LUW中.程序使用COMMIT WORK提交修改请 ...

  2. VSS 请求程序和 SharePoint 2013

    Windows Server 中的 VSS 可用于创建可备份和还原 Microsoft SharePoint Foundation 的应用程序.VSS 提供了一个基础结构,使第三方存储管理程序.业务程 ...

  3. ICSharpCode.SharpZipLib简单使用

    胡乱做了个小例子,记录下来,以便后面复习. using System; using System.Collections.Generic; using System.Linq; using Syste ...

  4. 获取设备IMEI ,手机名称,系统SDK版本号,系统版本号

    1.获取设备IMEI TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Str ...

  5. Android判断屏幕开关状态

    方法一:使用系统服务 PowerManager pm= (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); if(!pm. ...

  6. iOS 跳转到App Store下载或评论

    //跳转到app在AppStore页面 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString string ...

  7. 【代码笔记】iOS-读取一段文字

    一,效果图. 二,工程图. 三,代码. RootViewController.m #import "RootViewController.h" @interface RootVie ...

  8. 转:查看sql语句执行时间/测试sql语句性能

    原文出处:http://www.cnblogs.com/qanholas/archive/2011/05/06/2038543.html 写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务 ...

  9. jetty for linux 启用日志

    jetty7.8 文档 :https://wiki.eclipse.org/Jetty jetty9 文档: http://www.eclipse.org/jetty/documentation/cu ...

  10. 【转】JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...