ApplicationWindow

时间:2023-01-13 11:04:11

本文介绍了一个使用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. }

以上就是代码部分。

程序运行如下所示:

ApplicationWindow

图标文件存储在项目 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. linux 文件类型 文件权限

    linux中常见的文件类型有: “—”表示普通文件 :-rw-r--r-- 1 root root 41727 07-13 02:56 install.log   “d”表示目录 :drwxr-xr- ...

  2. JavaScript 中的内存泄漏

    JavaScript 中的内存泄漏 JavaScript 是一种垃圾收集式语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回.JavaScript 的垃圾收集机 ...

  3. 行内元素有哪些&quest;块级元素有哪些&quest;CSS的盒模型&quest;转载

    块级元素:div p h1 h2 h3 h4 form ul行内元素: a b br i span input selectCss盒模型:内容,border ,margin,padding css中的 ...

  4. VRTK实现瞬移需要添加的脚本

    进入一个新的公司,boss让实现漫游,但是新公司的Unity版本是5.6,我之前的瞬移插件不好用了,无奈之下找到一个我不熟悉的插件VRTK,但是查了很多资料也没有实现瞬移.经过自己查脚本与实验终于得到 ...

  5. 编年史:OI测试

    2019.4.18 t1:给出不定方程ax+by+c=0,求x在x1~x2并且y在y1~y2时的解个数.考场上想的是一个扩欧板子敲下去,然后构造出x>=x1的最小解,同时得出y,然后通过通项来枚 ...

  6. 1&period;8&period;3suspend与resume方法的缺点--不同步

    package com.cky.bean; /** * Created by edison on 2017/12/3. */ public class MyObject { private Strin ...

  7. jsoncpp在Windows和Linux下的安装

    Windows下: 参考这个网站,没什么问题,注意MTd这些选对就行了. http://www.cppblog.com/wanghaiguang/archive/2013/12/26/205020.h ...

  8. Activity的setResult方法

    Activity的setResult方法http://blog.csdn.net/dinglin_87/article/details/8970144 调用setResult()方法必须在finish ...

  9. &lbrack;转载&rsqb;Linux I&sol;O 调度方法

    http://scoke.blog.51cto.com/769125/490546 IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以 ...

  10. End-to-End Speech Recognition in English and Mandarin

    w语音识别.噪音.方言,算法迭代. https://arxiv.org/abs/1512.02595 We show that an end-to-end deep learning approach ...