您的位置:首页 > 移动开发

JFace 的 ApplicationWindow 类应用实例

2012-12-18 21:35 134 查看
本文中代码主要参考了《Eclipse SWT/JFace 核心应用》第15章的程序。

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

首先看 MainWindow.java。

//MainWindow.java

import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class MainWindow extends ApplicationWindow{
private NewAction newAction;
private OpenAction openAction;
private SaveAction saveAction;
private SaveAsAction saveAsAction;
private ExitAction exitAction;
private CopyAction copyAction;
private CutAction cutAction;
private PasteAction pasteAction;
private HelpAction helpAction;
private FileManager manager;
private Text content;
private static MainWindow app;

private MainWindow(){
super(null);
app = this;
manager = new FileManager();
newAction = new NewAction();
openAction = new OpenAction();
saveAction = new SaveAction();
saveAsAction = new SaveAsAction();
exitAction = new ExitAction();
copyAction = new CopyAction();
cutAction = new CutAction();
pasteAction = new PasteAction();
helpAction = new HelpAction();

this.addMenuBar();
this.addToolBar(SWT.FLAT);
this.addStatusLine();
}

public static MainWindow getApp(){
return app;
}

protected void configureShell(Shell shell){
super.configureShell(shell);
shell.setText("简单写字板");
shell.setMaximized(true);
}

protected Control createContents(Composite parent){
content = new Text(parent, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
content.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e){
manager.setDirty(true);
}
});
return parent;
}

protected MenuManager createMenuManager(){
MenuManager menuBar = new MenuManager();

MenuManager fileMenu = new MenuManager("文件(&F)");
MenuManager editMenu = new MenuManager("编辑(&E)");
MenuManager formatMenu = new MenuManager("格式(&F)");
MenuManager helpMenu = new MenuManager("帮助(&H)");

menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(formatMenu);
menuBar.add(helpMenu);

fileMenu.add(newAction);
fileMenu.add(openAction);
fileMenu.add(new Separator());
fileMenu.add(saveAction);
fileMenu.add(saveAsAction);
fileMenu.add(new Separator());
fileMenu.add(exitAction);

editMenu.add(copyAction);
editMenu.add(cutAction);
editMenu.add(pasteAction);

formatMenu.add(new FormatAction(FormatAction.TYPE_FONT));
formatMenu.add(new FormatAction(FormatAction.TYPE_BGCOLOR));
formatMenu.add(new FormatAction(FormatAction.TYPE_FORECOLOR));

helpMenu.add(helpAction);
return menuBar;
}

public static void main(String[] args){
MainWindow main = new MainWindow();
main.setBlockOnOpen(true);
main.open();
Display.getCurrent().dispose();
}

public Text getContent(){
return content;
}
public FileManager getManager(){
return manager;
}
public void setManager(FileManager manager){
this.manager = manager;
}

public StatusLineManager getStatusLineManager(){
return super.getStatusLineManager();
}
}


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

FileManager.java:

//FileManager.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class FileManager {
private String fileName;
private boolean dirty = false;
private String content;
public FileManager(){

}

public void load(String name){
final String textString;
try{
File file = new File(name);
FileInputStream stream = new FileInputStream(file.getPath());
Reader in = new BufferedReader(new InputStreamReader(stream));
char[] readBuffer = new char[2048];
StringBuffer buffer = new StringBuffer((int)file.length());
int n;
while((n=in.read(readBuffer))>0){
buffer.append(readBuffer, 0 ,n);
}
textString = buffer.toString();
stream.close();
}catch(FileNotFoundException e){
MainWindow.getApp().getStatusLineManager().setMessage("文件未找到:"+fileName);
return;
}catch(IOException e){
MainWindow.getApp().getStatusLineManager().setMessage("读文件出错: "+fileName);
return;
}
content = textString;
this.fileName= name;
}

public void save(String name){
final String textString = content;
try{
File file = new File(name);
FileOutputStream stream = new FileOutputStream(file.getPath());
Writer out = new OutputStreamWriter(stream);
out.write(textString);
out.flush();
stream.close();
}catch(FileNotFoundException e){
MainWindow.getApp().getStatusLineManager().setMessage("文件未找到:"+fileName);
return;
}catch(IOException e){
MainWindow.getApp().getStatusLineManager().setMessage("读文件出错: "+fileName);
return;
}
}

public String getContent(){
return content;
}

public void setContent(String content){
this.content = content;
}

public boolean isDirty(){
return dirty;
}

public void setDirty(boolean dirty){
this.dirty = dirty;
}

public String getFileName(){
return fileName;
}

public void setFileName(String fileName){
this.fileName = fileName;
}
}


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

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

CopyAction.java

//CopyAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;

public class CopyAction extends Action{
public CopyAction(){
super();
setText("复制(&C)");
setToolTipText("复制");
setAccelerator(SWT.CTRL + 'C');
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\copy.gif"));
}

public void run(){
MainWindow.getApp().getContent().copy();
}
}


CutAction.java

//CutAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;

public class CutAction extends Action{
public CutAction(){
super();
setText("剪切(&C)");
setToolTipText("剪切");
setAccelerator(SWT.CTRL + 'X');
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\cut.gif"));
}

public void run(){
MainWindow.getApp().getContent().cut();
}
}


ExitAction.java

//ExitAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;

public class ExitAction extends Action{
public ExitAction(){
super();
setText("退出(&E)");
setToolTipText("退出系统");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\exit.gif"));
}

public void run(){
MainWindow.getApp().close();
}
}


FormatAction.java

//FormatAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Text;

public class FormatAction extends Action{
public static final String TYPE_FORECOLOR = "FORECOLOR";
public static final String TYPE_BGCOLOR = "BGCOLOR";
public static final String TYPE_FONT = "FONT";
private String formatType;
public FormatAction(String type){
super();
this.formatType = type;
initAction();
}

private void initAction(){
if(formatType.equals(TYPE_FONT)){
this.setText("设置字体");
this.setToolTipText("设置字体");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\font.gif"));
}else if(formatType.equals(TYPE_FORECOLOR)){
this.setText("设置前景色");
this.setToolTipText("设置前景色");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\foreColor.gif"));
}else{
this.setText("设置背景色");
this.setToolTipText("设置背景色");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\bgColor.gif"));
}
}

public void run(){
Text content = MainWindow.getApp().getContent();
if(formatType.equals(TYPE_FONT)){
FontDialog fontDialog = new FontDialog(MainWindow.getApp().getShell());
fontDialog.setFontList(content.getFont().getFontData());
FontData fontData = fontDialog.open();
if(fontData != null){
Font font = new Font(MainWindow.getApp().getShell().getDisplay(), fontData);
content.setFont(font);
}
}else if(formatType.equals(TYPE_FORECOLOR)){
ColorDialog colorDialog = new ColorDialog(MainWindow.getApp().getShell());
colorDialog.setRGB(content.getForeground().getRGB());
RGB rgb = colorDialog.open();
if(rgb != null){
Color foregroundColor = new Color(MainWindow.getApp().getShell().getDisplay(), rgb);
content.setForeground(foregroundColor);
foregroundColor.dispose();
}
}else{
ColorDialog colorDialog = new ColorDialog(MainWindow.getApp().getShell());
colorDialog.setRGB(content.getForeground().getRGB());
RGB rgb = colorDialog.open();
if(rgb != null){
Color bgColor = new Color(MainWindow.getApp().getShell().getDisplay(), rgb);
content.setForeground(bgColor);
bgColor.dispose();
}
}
}
}


HelpAction.java

//HelpAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;

public class HelpAction extends Action{
public HelpAction(){
super();
setText("帮助内容(&H)");
setToolTipText("帮助");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class,"icons/help.gif"));
}

public void run(){
MessageDialog.openInformation(null,"帮助","谢谢使用!");
}
}


NewAction.java

//NewAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;

public class NewAction extends Action{
public NewAction(){
super();
setText("新建(&N)");
this.setAccelerator(SWT.ALT + SWT.SHIFT + 'N');
setToolTipText("新建");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\new.gif"));
}

public void run(){
MainWindow.getApp().getContent().setText("");
MainWindow.getApp().setManager(new FileManager());
}
}


OpenAction.java

//OpenAction.java

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;

public class OpenAction extends Action{
public OpenAction(){
super();
setText("打开(&O)");
setToolTipText("打开文件");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\open.gif"));
}

public void run(){
FileDialog dialog = new FileDialog(MainWindow.getApp().getShell(), SWT.OPEN);
dialog.setFilterExtensions(new String[]{"*.java", "*.*"});
final String name = dialog.open();
if((name == null) || (name.length()==0))
return;
final FileManager fileManager = MainWindow.getApp().getManager();
try{
ModalContext.run(new IRunnableWithProgress(){
public void run(IProgressMonitor progressMonitor){
progressMonitor.beginTask("打开文件", IProgressMonitor.UNKNOWN);
fileManager.load(name);

progressMonitor.done();
}
}, true, MainWindow.getApp().getStatusLineManager().getProgressMonitor(),
MainWindow.getApp().getShell().getDisplay());
}catch(InvocationTargetException e){
e.printStackTrace();
}catch(InterruptedException e){
e.printStackTrace();
}

MainWindow.getApp().getContent().setText(fileManager.getContent());
MainWindow.getApp().getStatusLineManager().setMessage("当前打开的文件是: "+name);
}
}


PasteAction.java

//PasteAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;

public class PasteAction extends Action{
public PasteAction(){
super();
setText("粘贴(&P)");
setToolTipText("粘贴");
setAccelerator(SWT.CTRL + 'V');
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\copy.gif"));
}

public void run(){
MainWindow.getApp().getContent().copy();
}
}


SaveAction.java

//SaveAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MessageBox;

public class SaveAction extends Action{
public SaveAction(){
super();
setText("保存(&S)");
setToolTipText("保存文件");

setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\save.gif"));
}

public void run(){
final FileManager fileManager = MainWindow.getApp().getManager();
if(!fileManager.isDirty())
return;
if(fileManager.getFileName()==null){
FileDialog saveDialog = new FileDialog(MainWindow.getApp().getShell(), SWT.SAVE);
saveDialog.setText("请选择所要保存的文件");
saveDialog.setFilterPath("F:\\");
saveDialog.setFilterExtensions(new String[]{"*.java","*.*"});
String saveFile = saveDialog.open();
if(saveFile != null){
fileManager.setFileName(saveFile);
fileManager.setContent(MainWindow.getApp().getContent().getText());
fileManager.save(fileManager.getFileName());
}
fileManager.setDirty(false);
return;
}
if(fileManager.getFileName()!=null){
MessageBox box = new MessageBox(MainWindow.getApp().getShell(), SWT.ICON_QUESTION | SWT.YES| SWT.NO);
box.setMessage("您确定要保存文件吗?");
int choice = box.open();
if(choice == SWT.NO)
return;
fileManager.setContent(MainWindow.getApp().getContent().getText());
fileManager.save(fileManager.getFileName());
fileManager.setDirty(false);
return;
}
}
}


SaveAsAction.java

//SaveAsAction.java

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;

public class SaveAsAction extends Action{
public SaveAsAction(){
super();
setText("另存为(&A)");
setToolTipText("另存为");
setImageDescriptor(ImageDescriptor.createFromFile(NewAction.class, "icons\\saveas.gif"));
}

public void run(){
final FileManager fileManager = MainWindow.getApp().getManager();
FileDialog saveDialog = new FileDialog(MainWindow.getApp().getShell(), SWT.SAVE);
saveDialog.setText("请选择所要保存的文件");
saveDialog.setFilterPath("F:\\");
saveDialog.setFilterExtensions(new String[]{"*.java","*.*"});
String saveFile = saveDialog.open();
if(saveFile !=null){
fileManager.setFileName(saveFile);
fileManager.setContent(MainWindow.getApp().getContent().getText());
fileManager.save(fileManager.getFileName());
}
fileManager.setDirty(false);
return;
}
}


以上就是代码部分。

程序运行如下所示:



图标文件存储在项目 bin 目录下的 icons 目录下。所有图标文件都是从org.eclipse.ui_*.jar 中获取的。只是改了一下文件名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: