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

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

05-11 22:14