SWT(JFace) 文本编辑器 实现代码
时间:2020-11-25 11:58:02|栏目:JAVA代码|点击: 次
代码如下:
实现1:
BasicEditor.java
package swt_jface.demo5;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class BasicEditor {
Display display = new Display();
Shell shell = new Shell(display);
StyledText text;
boolean hasUnsavedChanges;
File file;
private String lastOpenDirectory;
public static final String APP_NAME = "BasicEditor v1.0";
MenuItem miWrap = null;
public BasicEditor() {
shell.setLayout(new GridLayout());
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT );
ToolItem tiNew = new ToolItem(toolBar, SWT.PUSH);
tiNew.setText("&New");
tiNew.setImage(getImage("new.gif"));
tiNew.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
});
ToolItem tiOpen = new ToolItem(toolBar, SWT.PUSH);
tiOpen.setText("&Open");
tiOpen.setImage(getImage("open.gif"));
tiOpen.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard())
loadTextFromFile();
}
});
ToolItem tiSave = new ToolItem(toolBar, SWT.PUSH);
tiSave.setText("&Save");
tiSave.setImage(getImage("save.gif"));
tiSave.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
saveTextToFile();
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tiCopy = new ToolItem(toolBar, SWT.PUSH);
tiCopy.setText("&Copy");
tiCopy.setImage(getImage("copy.gif"));
tiCopy.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.copy();
}
});
ToolItem tiCut = new ToolItem(toolBar, SWT.PUSH);
tiCut.setText("Cu&t");
tiCut.setImage(getImage("cut.gif"));
tiCut.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.cut();
}
});
ToolItem tiPaste = new ToolItem(toolBar, SWT.PUSH);
tiPaste.setText("&Paste");
tiPaste.setImage(getImage("paste.gif"));
tiPaste.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.paste();
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
final ToolItem tiWrap = new ToolItem(toolBar, SWT.CHECK);
tiWrap.setText("&Wrap");
tiWrap.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.setWordWrap(tiWrap.getSelection());
miWrap.setSelection(tiWrap.getSelection());
}
});
toolBar.pack();
System.out.println("Client area: " + shell.getClientArea());
text =
new StyledText(
shell,
SWT.MULTI
| SWT.WRAP
| SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL);
text.setLayoutData(new GridData(GridData.FILL_BOTH));
Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
text.setFont(font);
text.setText("BasicEditor version 1.0\r\nWriten by Jack Li Guojie. ");
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
hasUnsavedChanges = true;
}
});
Menu menuBar = new Menu(shell, SWT.BAR);
MenuItem fileMenuItem = new MenuItem(menuBar, SWT.CASCADE);
fileMenuItem.setText("&File");
Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
MenuItem miNew = new MenuItem(fileMenu, SWT.PUSH);
miNew.setText("&New\tCtrl+N");
miNew.setImage(getImage("new.gif"));
miNew.setAccelerator(SWT.CTRL + 'N');
miNew.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
});
MenuItem miOpen = new MenuItem(fileMenu, SWT.PUSH);
miOpen.setText("&Open\tCtrl+O");
miOpen.setAccelerator(SWT.CTRL + 'O');
miOpen.setImage(getImage("open.gif"));
miOpen.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard())
loadTextFromFile();
}
});
MenuItem miSave = new MenuItem(fileMenu, SWT.PUSH);
miSave.setText("&Save\tCtrl+S");
miSave.setImage(getImage("save.gif"));
miSave.setAccelerator(SWT.CTRL + 'S');
miSave.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
saveTextToFile();
}
});
new MenuItem(fileMenu, SWT.SEPARATOR);
MenuItem miExit = new MenuItem(fileMenu, SWT.PUSH);
miExit.setText("&Exit");
miExit.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard())
shell.dispose();
}
});
fileMenuItem.setMenu(fileMenu);
MenuItem editMenuItem = new MenuItem(menuBar, SWT.CASCADE);
editMenuItem.setText("&Edit");
Menu editMenu = new Menu(shell, SWT.DROP_DOWN);
MenuItem miCopy = new MenuItem(editMenu, SWT.PUSH);
miCopy.setText("&Copy\tCtrl+C");
miCopy.setImage(getImage("copy.gif"));
miCopy.setAccelerator(SWT.CTRL + 'C');
miCopy.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.copy();
}
});
MenuItem miCut = new MenuItem(editMenu, SWT.PUSH);
miCut.setText("Cu&t\tCtrl+X");
miCut.setImage(getImage("cut.gif"));
miCut.setAccelerator(SWT.CTRL + 'X');
miCut.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.cut();
}
});
MenuItem miPaste = new MenuItem(editMenu, SWT.PUSH);
miPaste.setText("&Paste\tCtrl+P");
miPaste.setImage(getImage("paste.gif"));
miPaste.setAccelerator(SWT.CTRL + 'P');
miPaste.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.paste();
}
});
editMenuItem.setMenu(editMenu);
MenuItem formatMenuItem = new MenuItem(menuBar, SWT.CASCADE);
formatMenuItem.setText("&Format");
Menu formatMenu = new Menu(shell, SWT.DROP_DOWN);
miWrap = new MenuItem(formatMenu, SWT.CHECK);
miWrap.setText("&Wrap\tCtrl+W");
miWrap.setAccelerator(SWT.CTRL + 'W');
miWrap.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.setWordWrap(miWrap.getSelection());
tiWrap.setSelection(miWrap.getSelection());
}
});
formatMenuItem.setMenu(formatMenu);
shell.setMenuBar(menuBar);
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
ImageRegistry imageRegistry = new ImageRegistry();
private Image getImage(String shortFileName) {
if(imageRegistry.getDescriptor(shortFileName) == null) {
ImageDescriptor descriptor = ImageDescriptor.createFromFile(null, "C:/icons/" + shortFileName);
imageRegistry.put(shortFileName, descriptor);
}
return imageRegistry.get(shortFileName);
}
boolean handleChangesBeforeDiscard() {
if(! hasUnsavedChanges)
return true;
MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage("Do you want to save the changes to " + (file == null ? "a file?" : file.getName()));
messageBox.setText(APP_NAME);
int ret = messageBox.open();
if(ret == SWT.YES) {
return saveTextToFile();
}else if(ret == SWT.NO) {
return true;
}else{
return false;
}
}
boolean loadTextFromFile() {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: loading the text from a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
while((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
text.setText(sb.toString());
return true;
}catch(IOException e) {
log("Failed to load the text from file: " + file);
log(e.toString());
}
return false;
}
boolean saveTextToFile() {
if (file == null) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: saving the text to a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
}
try {
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();
log("The text has been saved to file: " + file);
hasUnsavedChanges = false;
return true;
} catch (IOException e) {
log("Failed to save the text to file: " + file);
log(e.toString());
}
return false;
}
void log(String message) {
System.out.println(message);
}
public static void main(String[] args) {
new BasicEditor();
}
}
实现2:
BasicEditor2.java
package swt_jface.demo5;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Decorations;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
public class BasicEditor2 {
Display display = new Display();
Shell shell = new Shell(display);
StyledText text;
boolean hasUnsavedChanges;
File file;
private String lastOpenDirectory;
public static final String APP_NAME = "BasicEditor v2.0";
MenuItem miWrap = null;
public BasicEditor2() {
Action actionNew =
new Action(
"&New",
ImageDescriptor.createFromFile(null, "C:/icons/new.gif")) {
public void run() {
if (handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
};
actionNew.setAccelerator(SWT.CTRL + 'N');
Action actionOpen =
new Action(
"&Open",
ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) {
public void run() {
if (handleChangesBeforeDiscard())
loadTextFromFile();
}
};
actionOpen.setAccelerator(SWT.CTRL + 'O');
Action actionSave =
new Action(
"&Save\tCtrl+S",
ImageDescriptor.createFromFile(null, "C:/icons/save.gif")) {
public void run() {
saveTextToFile();
}
};
//actionSave.setAccelerator(SWT.CTRL + 'S');
Action actionCopy =
new Action(
"&Copy",
ImageDescriptor.createFromFile(null, "C:/icons/copy.gif")) {
public void run() {
text.copy();
}
};
actionCopy.setAccelerator(SWT.CTRL + 'C');
Action actionCut =
new Action(
"Cu&t",
ImageDescriptor.createFromFile(null, "C:/icons/cut.gif")) {
public void run() {
text.cut();
}
};
actionCut.setAccelerator(SWT.CTRL + 'X');
Action actionPaste =
new Action(
"&Paste",
ImageDescriptor.createFromFile(null, "C:/icons/paste.gif")) {
public void run() {
text.paste();
}
};
actionPaste.setAccelerator(SWT.CTRL + 'P');
Action actionWrap =
new Action(
"&Wrap", IAction.AS_CHECK_BOX) {
public void run() {
text.setWordWrap(isChecked());
}
};
actionWrap.setAccelerator(SWT.CTRL + 'W');
Action actionExit = new Action("&Exit@Ctrl+X") {
public void run() {
if (handleChangesBeforeDiscard())
shell.dispose();
}
};
System.out.println(actionWrap.getText());
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT);
ToolBarManager toolBarManager = new ToolBarManager(toolBar);
toolBarManager.add(actionNew);
toolBarManager.add(actionOpen);
toolBarManager.add(actionSave);
toolBarManager.add(new Separator());
toolBarManager.add(actionCopy);
toolBarManager.add(actionCut);
toolBarManager.add(actionPaste);
toolBarManager.add(new Separator());
toolBarManager.add(actionWrap);
toolBarManager.update(true);
shell.setLayout(new GridLayout());
System.out.println("Client area: " + shell.getClientArea());
text =
new StyledText(
shell,
SWT.MULTI
| SWT.WRAP
| SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL);
text.setLayoutData(new GridData(GridData.FILL_BOTH));
Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
text.setFont(font);
text.setText("BasicEditor version 1.0\r\nWriten by Jack Li Guojie. ");
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
hasUnsavedChanges = true;
}
});
MenuManager barMenuManager = new MenuManager();
MenuManager fileMenuManager = new MenuManager("&File");
MenuManager editMenuManager = new MenuManager("&Edit");
MenuManager formatMenuManager = new MenuManager("&Format");
barMenuManager.add(fileMenuManager);
barMenuManager.add(editMenuManager);
barMenuManager.add(formatMenuManager);
fileMenuManager.add(actionNew);
fileMenuManager.add(actionOpen);
fileMenuManager.add(actionSave);
fileMenuManager.add(new Separator());
fileMenuManager.add(actionExit);
editMenuManager.add(actionCopy);
editMenuManager.add(actionCut);
editMenuManager.add(actionPaste);
formatMenuManager.add(actionWrap);
// shell.setMenuBar(menuBar);
barMenuManager.updateAll(true);
shell.setMenuBar(barMenuManager.createMenuBar((Decorations)shell));
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
ImageRegistry imageRegistry = new ImageRegistry();
private Image getImage(String shortFileName) {
if (imageRegistry.getDescriptor(shortFileName) == null) {
ImageDescriptor descriptor =
ImageDescriptor.createFromFile(null, "C:/icons/" + shortFileName);
imageRegistry.put(shortFileName, descriptor);
}
return imageRegistry.get(shortFileName);
}
boolean handleChangesBeforeDiscard() {
if (!hasUnsavedChanges)
return true;
MessageBox messageBox =
new MessageBox(
shell,
SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage(
"Do you want to save the changes to "
+ (file == null ? "a file?" : file.getName()));
messageBox.setText(APP_NAME);
int ret = messageBox.open();
if (ret == SWT.YES) {
return saveTextToFile();
} else if (ret == SWT.NO) {
return true;
} else {
return false;
}
}
boolean loadTextFromFile() {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: loading the text from a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
text.setText(sb.toString());
return true;
} catch (IOException e) {
log("Failed to load the text from file: " + file);
log(e.toString());
}
return false;
}
boolean saveTextToFile() {
if (file == null) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: saving the text to a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
}
try {
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();
log("The text has been saved to file: " + file);
hasUnsavedChanges = false;
return true;
} catch (IOException e) {
log("Failed to save the text to file: " + file);
log(e.toString());
}
return false;
}
void log(String message) {
System.out.println(message);
}
public static void main(String[] args) {
new BasicEditor2();
}
}
实现3:
BasicEditor3.java
package swt_jface.demo11;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.StyledTextPrintOptions;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Decorations;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
public class BasicEditor3 {
Display display = new Display();
Shell shell = new Shell(display);
StyledText text;
boolean hasUnsavedChanges;
File file;
private String lastOpenDirectory;
public static final String APP_NAME = "BasicEditor v3.0";
MenuItem miWrap = null;
public BasicEditor3() {
Action actionNew =
new Action(
"&New",
ImageDescriptor.createFromFile(null, "C:/icons/new.gif")) {
public void run() {
if (handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
};
actionNew.setAccelerator(SWT.CTRL + 'N');
Action actionOpen =
new Action(
"&Open",
ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) {
public void run() {
if (handleChangesBeforeDiscard())
loadTextFromFile();
}
};
actionOpen.setAccelerator(SWT.CTRL + 'O');
Action actionSave =
new Action(
"&Save\tCtrl+S",
ImageDescriptor.createFromFile(null, "C:/icons/save.gif")) {
public void run() {
saveTextToFile();
}
};
actionSave.setAccelerator(SWT.CTRL + 'S');
Action actionCopy =
new Action(
"&Copy",
ImageDescriptor.createFromFile(null, "C:/icons/copy.gif")) {
public void run() {
text.copy();
}
};
actionCopy.setAccelerator(SWT.CTRL + 'C');
Action actionCut =
new Action(
"Cu&t",
ImageDescriptor.createFromFile(null, "C:/icons/cut.gif")) {
public void run() {
text.cut();
}
};
actionCut.setAccelerator(SWT.CTRL + 'X');
Action actionPaste =
new Action(
"&Paste",
ImageDescriptor.createFromFile(null, "C:/icons/paste.gif")) {
public void run() {
text.paste();
}
};
actionPaste.setAccelerator(SWT.CTRL + 'P');
Action actionWrap =
new Action(
"&Wrap", IAction.AS_CHECK_BOX) {
public void run() {
text.setWordWrap(isChecked());
}
};
actionWrap.setAccelerator(SWT.CTRL + 'W');
Action actionExit = new Action("&Exit@Ctrl+X") {
public void run() {
if (handleChangesBeforeDiscard())
shell.dispose();
}
};
Action actionPrint = new Action("&Print@Ctrl+P") {
public void run() {
printText(text.getText());
}
};
Action actionPrint2 = new Action("Print (StyledText)") {
public void run() {
StyledTextPrintOptions options = new StyledTextPrintOptions();
options.header = "SWT";
options.footer = "Page <page>";
options.jobName = "Text";
Runnable runnable = text.print(new Printer(), options);
runnable.run();
}
};
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT);
ToolBarManager toolBarManager = new ToolBarManager(toolBar);
toolBarManager.add(actionNew);
toolBarManager.add(actionOpen);
toolBarManager.add(actionSave);
toolBarManager.add(new Separator());
toolBarManager.add(actionCopy);
toolBarManager.add(actionCut);
toolBarManager.add(actionPaste);
toolBarManager.add(new Separator());
toolBarManager.add(actionWrap);
toolBarManager.add(new Separator());
toolBarManager.add(actionPrint);
toolBarManager.add(actionPrint2);
toolBarManager.update(true);
shell.setText(APP_NAME);
shell.setLayout(new GridLayout());
text =
new StyledText(
shell,
SWT.MULTI
| SWT.WRAP
| SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL);
text.setLayoutData(new GridData(GridData.FILL_BOTH));
Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
text.setFont(font);
text.setText("BasicEditor version 3.0\r\nWriten by Jack Li Guojie. ");
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
hasUnsavedChanges = true;
}
});
MenuManager barMenuManager = new MenuManager();
MenuManager fileMenuManager = new MenuManager("&File");
MenuManager editMenuManager = new MenuManager("&Edit");
MenuManager formatMenuManager = new MenuManager("&Format");
barMenuManager.add(fileMenuManager);
barMenuManager.add(editMenuManager);
barMenuManager.add(formatMenuManager);
fileMenuManager.add(actionNew);
fileMenuManager.add(actionOpen);
fileMenuManager.add(actionSave);
fileMenuManager.add(actionPrint);
fileMenuManager.add(new Separator());
fileMenuManager.add(actionExit);
editMenuManager.add(actionCopy);
editMenuManager.add(actionCut);
editMenuManager.add(actionPaste);
formatMenuManager.add(actionWrap);
//shell.setMenuBar(menuBar);
barMenuManager.updateAll(true);
shell.setMenuBar(barMenuManager.createMenuBar((Decorations)shell));
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
int x;
int y;
int lineHeight;
PrintMargin margins;
int pageNumber = 1;
int lineNumber = 1;
void printText(String text) {
PrintDialog dialog = new PrintDialog(shell);
PrinterData printerData = dialog.open();
if(printerData == null) return;
Printer printer = new Printer(printerData);
if(! printer.startJob("text")) return;
GC gc = new GC(printer);
margins = PrintMargin.getPrintMargin(printer, 1.0);
x = margins.left;
y = margins.top;
StringBuffer buffer = new StringBuffer();
Font font = new Font(printer, "Arial", 12, SWT.NORMAL);
gc.setFont(font);
lineHeight = gc.getFontMetrics().getHeight();
printer.startPage();
String page = "- " + pageNumber + " -";
gc.drawString(page, (margins.right - margins.left - gc.textExtent(page).x) / 2 + margins.left, margins.bottom + gc.textExtent(page).y);
for(int index = 0; index <text.length();) {
char c = text.charAt(index);
switch(c) {
case '\r':
if(index < text.length() - 1 && text.charAt(index + 1) == '\n') {
printNewLine(printer, gc, buffer.toString());
buffer.setLength(0);
index += 2;
}
break;
case '\t':
case ' ':
if(gc.textExtent(buffer.toString() + ' ').x > margins.right - margins.left) {
printNewLine(printer, gc, buffer.toString());
buffer.setLength(0);
}
buffer.append(c);
if(index < text.length() - 1 && (!Character.isWhitespace(text.charAt(index + 1)))) { // Looks up one word to see whether the line should wraps here.
String word = readWord(text, index + 1);
if(gc.textExtent(buffer.toString() + word).x > margins.right - margins.left) {
printNewLine(printer, gc, buffer.toString());
buffer.setLength(0);
}
}
index += 1;
break;
default:
buffer.append(c);
index += 1;
}
}
if(buffer.length() > 0) printNewLine(printer, gc, buffer.toString());
if(y + lineHeight <= margins.bottom) printer.endPage();
printer.endJob();
gc.dispose();
font.dispose();
printer.dispose();
}
void printNewLine(Printer printer, GC gc, String line) {
if(y + lineHeight > margins.bottom) {
printer.endPage();
x = margins.left;
y = margins.top;
pageNumber ++;
lineNumber = 1;
String page = "- " + pageNumber + " -";
gc.drawString(page, (margins.right - margins.left - gc.textExtent(page).x) / 2 + margins.left, margins.bottom + gc.textExtent(page).y);
}
gc.drawString(line, x, y);
y += lineHeight;
}
String readWord(String text, int offset) {
StringBuffer sb = new StringBuffer();
int index = offset;
char c = 0;
while(index < text.length()) {
c = text.charAt(index);
if(Character.isWhitespace(c)) break;
sb.append(c);
index += 1;
}
return sb.toString();
}
ImageRegistry imageRegistry = new ImageRegistry();
// private Image getImage(String shortFileName) {
// if (imageRegistry.getDescriptor(shortFileName) == null) {
// ImageDescriptor descriptor =
// ImageDescriptor.createFromFile(null, "C:/icons/" + shortFileName);
// imageRegistry.put(shortFileName, descriptor);
// }
// return imageRegistry.get(shortFileName);
// }
boolean handleChangesBeforeDiscard() {
if (!hasUnsavedChanges)
return true;
MessageBox messageBox =
new MessageBox(
shell,
SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage(
"Do you want to save the changes to "
+ (file == null ? "a file?" : file.getName()));
messageBox.setText(APP_NAME);
int ret = messageBox.open();
if (ret == SWT.YES) {
return saveTextToFile();
} else if (ret == SWT.NO) {
return true;
} else {
return false;
}
}
boolean loadTextFromFile() {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: loading the text from a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
text.setText(sb.toString());
return true;
} catch (IOException e) {
log("Failed to load the text from file: " + file);
log(e.toString());
}
return false;
}
boolean saveTextToFile() {
if (file == null) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: saving the text to a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
}
try {
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();
log("The text has been saved to file: " + file);
hasUnsavedChanges = false;
return true;
} catch (IOException e) {
log("Failed to save the text to file: " + file);
log(e.toString());
}
return false;
}
void log(String message) {
System.out.println(message);
}
public static void main(String[] args) {
new BasicEditor3();
}
}
追加了打印机能,需要下面这个类:
package swt_jface.demo11;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.printing.Printer;
public class PrintMargin {
public int left;
public int right;
public int top;
public int bottom;
private PrintMargin(int left, int right, int top, int bottom) {
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;
}
static PrintMargin getPrintMargin(Printer printer, double margin) {
return getPrintMargin(printer, margin, margin, margin, margin);
}
static PrintMargin getPrintMargin(
Printer printer,
double marginLeft,
double marginRight,
double marginTop,
double marginBottom) {
Rectangle clientArea = printer.getClientArea();
Rectangle trim = printer.computeTrim(0, 0, 0, 0);
Point dpi = printer.getDPI();
int leftMargin = (int) (marginLeft * dpi.x) - trim.x;
int rightMargin =
clientArea.width
+ trim.width
- (int) (marginRight * dpi.x)
- trim.x;
int topMargin = (int) (marginTop * dpi.y) - trim.y;
int bottomMargin =
clientArea.height
+ trim.height
- (int) (marginBottom * dpi.y)
- trim.y;
return new PrintMargin(
leftMargin,
rightMargin,
topMargin,
bottomMargin);
}
public String toString() {
return "Margin { "
+ left
+ ", "
+ right
+ "; "
+ top
+ ", "
+ bottom
+ " }";
}
}
实现1:
BasicEditor.java
复制代码 代码如下:
package swt_jface.demo5;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class BasicEditor {
Display display = new Display();
Shell shell = new Shell(display);
StyledText text;
boolean hasUnsavedChanges;
File file;
private String lastOpenDirectory;
public static final String APP_NAME = "BasicEditor v1.0";
MenuItem miWrap = null;
public BasicEditor() {
shell.setLayout(new GridLayout());
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT );
ToolItem tiNew = new ToolItem(toolBar, SWT.PUSH);
tiNew.setText("&New");
tiNew.setImage(getImage("new.gif"));
tiNew.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
});
ToolItem tiOpen = new ToolItem(toolBar, SWT.PUSH);
tiOpen.setText("&Open");
tiOpen.setImage(getImage("open.gif"));
tiOpen.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard())
loadTextFromFile();
}
});
ToolItem tiSave = new ToolItem(toolBar, SWT.PUSH);
tiSave.setText("&Save");
tiSave.setImage(getImage("save.gif"));
tiSave.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
saveTextToFile();
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tiCopy = new ToolItem(toolBar, SWT.PUSH);
tiCopy.setText("&Copy");
tiCopy.setImage(getImage("copy.gif"));
tiCopy.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.copy();
}
});
ToolItem tiCut = new ToolItem(toolBar, SWT.PUSH);
tiCut.setText("Cu&t");
tiCut.setImage(getImage("cut.gif"));
tiCut.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.cut();
}
});
ToolItem tiPaste = new ToolItem(toolBar, SWT.PUSH);
tiPaste.setText("&Paste");
tiPaste.setImage(getImage("paste.gif"));
tiPaste.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.paste();
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
final ToolItem tiWrap = new ToolItem(toolBar, SWT.CHECK);
tiWrap.setText("&Wrap");
tiWrap.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.setWordWrap(tiWrap.getSelection());
miWrap.setSelection(tiWrap.getSelection());
}
});
toolBar.pack();
System.out.println("Client area: " + shell.getClientArea());
text =
new StyledText(
shell,
SWT.MULTI
| SWT.WRAP
| SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL);
text.setLayoutData(new GridData(GridData.FILL_BOTH));
Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
text.setFont(font);
text.setText("BasicEditor version 1.0\r\nWriten by Jack Li Guojie. ");
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
hasUnsavedChanges = true;
}
});
Menu menuBar = new Menu(shell, SWT.BAR);
MenuItem fileMenuItem = new MenuItem(menuBar, SWT.CASCADE);
fileMenuItem.setText("&File");
Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
MenuItem miNew = new MenuItem(fileMenu, SWT.PUSH);
miNew.setText("&New\tCtrl+N");
miNew.setImage(getImage("new.gif"));
miNew.setAccelerator(SWT.CTRL + 'N');
miNew.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
});
MenuItem miOpen = new MenuItem(fileMenu, SWT.PUSH);
miOpen.setText("&Open\tCtrl+O");
miOpen.setAccelerator(SWT.CTRL + 'O');
miOpen.setImage(getImage("open.gif"));
miOpen.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard())
loadTextFromFile();
}
});
MenuItem miSave = new MenuItem(fileMenu, SWT.PUSH);
miSave.setText("&Save\tCtrl+S");
miSave.setImage(getImage("save.gif"));
miSave.setAccelerator(SWT.CTRL + 'S');
miSave.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
saveTextToFile();
}
});
new MenuItem(fileMenu, SWT.SEPARATOR);
MenuItem miExit = new MenuItem(fileMenu, SWT.PUSH);
miExit.setText("&Exit");
miExit.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if(handleChangesBeforeDiscard())
shell.dispose();
}
});
fileMenuItem.setMenu(fileMenu);
MenuItem editMenuItem = new MenuItem(menuBar, SWT.CASCADE);
editMenuItem.setText("&Edit");
Menu editMenu = new Menu(shell, SWT.DROP_DOWN);
MenuItem miCopy = new MenuItem(editMenu, SWT.PUSH);
miCopy.setText("&Copy\tCtrl+C");
miCopy.setImage(getImage("copy.gif"));
miCopy.setAccelerator(SWT.CTRL + 'C');
miCopy.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.copy();
}
});
MenuItem miCut = new MenuItem(editMenu, SWT.PUSH);
miCut.setText("Cu&t\tCtrl+X");
miCut.setImage(getImage("cut.gif"));
miCut.setAccelerator(SWT.CTRL + 'X');
miCut.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.cut();
}
});
MenuItem miPaste = new MenuItem(editMenu, SWT.PUSH);
miPaste.setText("&Paste\tCtrl+P");
miPaste.setImage(getImage("paste.gif"));
miPaste.setAccelerator(SWT.CTRL + 'P');
miPaste.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.paste();
}
});
editMenuItem.setMenu(editMenu);
MenuItem formatMenuItem = new MenuItem(menuBar, SWT.CASCADE);
formatMenuItem.setText("&Format");
Menu formatMenu = new Menu(shell, SWT.DROP_DOWN);
miWrap = new MenuItem(formatMenu, SWT.CHECK);
miWrap.setText("&Wrap\tCtrl+W");
miWrap.setAccelerator(SWT.CTRL + 'W');
miWrap.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
text.setWordWrap(miWrap.getSelection());
tiWrap.setSelection(miWrap.getSelection());
}
});
formatMenuItem.setMenu(formatMenu);
shell.setMenuBar(menuBar);
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
ImageRegistry imageRegistry = new ImageRegistry();
private Image getImage(String shortFileName) {
if(imageRegistry.getDescriptor(shortFileName) == null) {
ImageDescriptor descriptor = ImageDescriptor.createFromFile(null, "C:/icons/" + shortFileName);
imageRegistry.put(shortFileName, descriptor);
}
return imageRegistry.get(shortFileName);
}
boolean handleChangesBeforeDiscard() {
if(! hasUnsavedChanges)
return true;
MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage("Do you want to save the changes to " + (file == null ? "a file?" : file.getName()));
messageBox.setText(APP_NAME);
int ret = messageBox.open();
if(ret == SWT.YES) {
return saveTextToFile();
}else if(ret == SWT.NO) {
return true;
}else{
return false;
}
}
boolean loadTextFromFile() {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: loading the text from a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
while((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
text.setText(sb.toString());
return true;
}catch(IOException e) {
log("Failed to load the text from file: " + file);
log(e.toString());
}
return false;
}
boolean saveTextToFile() {
if (file == null) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: saving the text to a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
}
try {
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();
log("The text has been saved to file: " + file);
hasUnsavedChanges = false;
return true;
} catch (IOException e) {
log("Failed to save the text to file: " + file);
log(e.toString());
}
return false;
}
void log(String message) {
System.out.println(message);
}
public static void main(String[] args) {
new BasicEditor();
}
}
实现2:
BasicEditor2.java
复制代码 代码如下:
package swt_jface.demo5;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Decorations;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
public class BasicEditor2 {
Display display = new Display();
Shell shell = new Shell(display);
StyledText text;
boolean hasUnsavedChanges;
File file;
private String lastOpenDirectory;
public static final String APP_NAME = "BasicEditor v2.0";
MenuItem miWrap = null;
public BasicEditor2() {
Action actionNew =
new Action(
"&New",
ImageDescriptor.createFromFile(null, "C:/icons/new.gif")) {
public void run() {
if (handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
};
actionNew.setAccelerator(SWT.CTRL + 'N');
Action actionOpen =
new Action(
"&Open",
ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) {
public void run() {
if (handleChangesBeforeDiscard())
loadTextFromFile();
}
};
actionOpen.setAccelerator(SWT.CTRL + 'O');
Action actionSave =
new Action(
"&Save\tCtrl+S",
ImageDescriptor.createFromFile(null, "C:/icons/save.gif")) {
public void run() {
saveTextToFile();
}
};
//actionSave.setAccelerator(SWT.CTRL + 'S');
Action actionCopy =
new Action(
"&Copy",
ImageDescriptor.createFromFile(null, "C:/icons/copy.gif")) {
public void run() {
text.copy();
}
};
actionCopy.setAccelerator(SWT.CTRL + 'C');
Action actionCut =
new Action(
"Cu&t",
ImageDescriptor.createFromFile(null, "C:/icons/cut.gif")) {
public void run() {
text.cut();
}
};
actionCut.setAccelerator(SWT.CTRL + 'X');
Action actionPaste =
new Action(
"&Paste",
ImageDescriptor.createFromFile(null, "C:/icons/paste.gif")) {
public void run() {
text.paste();
}
};
actionPaste.setAccelerator(SWT.CTRL + 'P');
Action actionWrap =
new Action(
"&Wrap", IAction.AS_CHECK_BOX) {
public void run() {
text.setWordWrap(isChecked());
}
};
actionWrap.setAccelerator(SWT.CTRL + 'W');
Action actionExit = new Action("&Exit@Ctrl+X") {
public void run() {
if (handleChangesBeforeDiscard())
shell.dispose();
}
};
System.out.println(actionWrap.getText());
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT);
ToolBarManager toolBarManager = new ToolBarManager(toolBar);
toolBarManager.add(actionNew);
toolBarManager.add(actionOpen);
toolBarManager.add(actionSave);
toolBarManager.add(new Separator());
toolBarManager.add(actionCopy);
toolBarManager.add(actionCut);
toolBarManager.add(actionPaste);
toolBarManager.add(new Separator());
toolBarManager.add(actionWrap);
toolBarManager.update(true);
shell.setLayout(new GridLayout());
System.out.println("Client area: " + shell.getClientArea());
text =
new StyledText(
shell,
SWT.MULTI
| SWT.WRAP
| SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL);
text.setLayoutData(new GridData(GridData.FILL_BOTH));
Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
text.setFont(font);
text.setText("BasicEditor version 1.0\r\nWriten by Jack Li Guojie. ");
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
hasUnsavedChanges = true;
}
});
MenuManager barMenuManager = new MenuManager();
MenuManager fileMenuManager = new MenuManager("&File");
MenuManager editMenuManager = new MenuManager("&Edit");
MenuManager formatMenuManager = new MenuManager("&Format");
barMenuManager.add(fileMenuManager);
barMenuManager.add(editMenuManager);
barMenuManager.add(formatMenuManager);
fileMenuManager.add(actionNew);
fileMenuManager.add(actionOpen);
fileMenuManager.add(actionSave);
fileMenuManager.add(new Separator());
fileMenuManager.add(actionExit);
editMenuManager.add(actionCopy);
editMenuManager.add(actionCut);
editMenuManager.add(actionPaste);
formatMenuManager.add(actionWrap);
// shell.setMenuBar(menuBar);
barMenuManager.updateAll(true);
shell.setMenuBar(barMenuManager.createMenuBar((Decorations)shell));
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
ImageRegistry imageRegistry = new ImageRegistry();
private Image getImage(String shortFileName) {
if (imageRegistry.getDescriptor(shortFileName) == null) {
ImageDescriptor descriptor =
ImageDescriptor.createFromFile(null, "C:/icons/" + shortFileName);
imageRegistry.put(shortFileName, descriptor);
}
return imageRegistry.get(shortFileName);
}
boolean handleChangesBeforeDiscard() {
if (!hasUnsavedChanges)
return true;
MessageBox messageBox =
new MessageBox(
shell,
SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage(
"Do you want to save the changes to "
+ (file == null ? "a file?" : file.getName()));
messageBox.setText(APP_NAME);
int ret = messageBox.open();
if (ret == SWT.YES) {
return saveTextToFile();
} else if (ret == SWT.NO) {
return true;
} else {
return false;
}
}
boolean loadTextFromFile() {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: loading the text from a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
text.setText(sb.toString());
return true;
} catch (IOException e) {
log("Failed to load the text from file: " + file);
log(e.toString());
}
return false;
}
boolean saveTextToFile() {
if (file == null) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: saving the text to a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
}
try {
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();
log("The text has been saved to file: " + file);
hasUnsavedChanges = false;
return true;
} catch (IOException e) {
log("Failed to save the text to file: " + file);
log(e.toString());
}
return false;
}
void log(String message) {
System.out.println(message);
}
public static void main(String[] args) {
new BasicEditor2();
}
}
实现3:
BasicEditor3.java
复制代码 代码如下:
package swt_jface.demo11;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.StyledTextPrintOptions;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Decorations;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
public class BasicEditor3 {
Display display = new Display();
Shell shell = new Shell(display);
StyledText text;
boolean hasUnsavedChanges;
File file;
private String lastOpenDirectory;
public static final String APP_NAME = "BasicEditor v3.0";
MenuItem miWrap = null;
public BasicEditor3() {
Action actionNew =
new Action(
"&New",
ImageDescriptor.createFromFile(null, "C:/icons/new.gif")) {
public void run() {
if (handleChangesBeforeDiscard()) {
file = null;
text.setText("");
}
}
};
actionNew.setAccelerator(SWT.CTRL + 'N');
Action actionOpen =
new Action(
"&Open",
ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) {
public void run() {
if (handleChangesBeforeDiscard())
loadTextFromFile();
}
};
actionOpen.setAccelerator(SWT.CTRL + 'O');
Action actionSave =
new Action(
"&Save\tCtrl+S",
ImageDescriptor.createFromFile(null, "C:/icons/save.gif")) {
public void run() {
saveTextToFile();
}
};
actionSave.setAccelerator(SWT.CTRL + 'S');
Action actionCopy =
new Action(
"&Copy",
ImageDescriptor.createFromFile(null, "C:/icons/copy.gif")) {
public void run() {
text.copy();
}
};
actionCopy.setAccelerator(SWT.CTRL + 'C');
Action actionCut =
new Action(
"Cu&t",
ImageDescriptor.createFromFile(null, "C:/icons/cut.gif")) {
public void run() {
text.cut();
}
};
actionCut.setAccelerator(SWT.CTRL + 'X');
Action actionPaste =
new Action(
"&Paste",
ImageDescriptor.createFromFile(null, "C:/icons/paste.gif")) {
public void run() {
text.paste();
}
};
actionPaste.setAccelerator(SWT.CTRL + 'P');
Action actionWrap =
new Action(
"&Wrap", IAction.AS_CHECK_BOX) {
public void run() {
text.setWordWrap(isChecked());
}
};
actionWrap.setAccelerator(SWT.CTRL + 'W');
Action actionExit = new Action("&Exit@Ctrl+X") {
public void run() {
if (handleChangesBeforeDiscard())
shell.dispose();
}
};
Action actionPrint = new Action("&Print@Ctrl+P") {
public void run() {
printText(text.getText());
}
};
Action actionPrint2 = new Action("Print (StyledText)") {
public void run() {
StyledTextPrintOptions options = new StyledTextPrintOptions();
options.header = "SWT";
options.footer = "Page <page>";
options.jobName = "Text";
Runnable runnable = text.print(new Printer(), options);
runnable.run();
}
};
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT);
ToolBarManager toolBarManager = new ToolBarManager(toolBar);
toolBarManager.add(actionNew);
toolBarManager.add(actionOpen);
toolBarManager.add(actionSave);
toolBarManager.add(new Separator());
toolBarManager.add(actionCopy);
toolBarManager.add(actionCut);
toolBarManager.add(actionPaste);
toolBarManager.add(new Separator());
toolBarManager.add(actionWrap);
toolBarManager.add(new Separator());
toolBarManager.add(actionPrint);
toolBarManager.add(actionPrint2);
toolBarManager.update(true);
shell.setText(APP_NAME);
shell.setLayout(new GridLayout());
text =
new StyledText(
shell,
SWT.MULTI
| SWT.WRAP
| SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL);
text.setLayoutData(new GridData(GridData.FILL_BOTH));
Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);
text.setFont(font);
text.setText("BasicEditor version 3.0\r\nWriten by Jack Li Guojie. ");
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
hasUnsavedChanges = true;
}
});
MenuManager barMenuManager = new MenuManager();
MenuManager fileMenuManager = new MenuManager("&File");
MenuManager editMenuManager = new MenuManager("&Edit");
MenuManager formatMenuManager = new MenuManager("&Format");
barMenuManager.add(fileMenuManager);
barMenuManager.add(editMenuManager);
barMenuManager.add(formatMenuManager);
fileMenuManager.add(actionNew);
fileMenuManager.add(actionOpen);
fileMenuManager.add(actionSave);
fileMenuManager.add(actionPrint);
fileMenuManager.add(new Separator());
fileMenuManager.add(actionExit);
editMenuManager.add(actionCopy);
editMenuManager.add(actionCut);
editMenuManager.add(actionPaste);
formatMenuManager.add(actionWrap);
//shell.setMenuBar(menuBar);
barMenuManager.updateAll(true);
shell.setMenuBar(barMenuManager.createMenuBar((Decorations)shell));
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
int x;
int y;
int lineHeight;
PrintMargin margins;
int pageNumber = 1;
int lineNumber = 1;
void printText(String text) {
PrintDialog dialog = new PrintDialog(shell);
PrinterData printerData = dialog.open();
if(printerData == null) return;
Printer printer = new Printer(printerData);
if(! printer.startJob("text")) return;
GC gc = new GC(printer);
margins = PrintMargin.getPrintMargin(printer, 1.0);
x = margins.left;
y = margins.top;
StringBuffer buffer = new StringBuffer();
Font font = new Font(printer, "Arial", 12, SWT.NORMAL);
gc.setFont(font);
lineHeight = gc.getFontMetrics().getHeight();
printer.startPage();
String page = "- " + pageNumber + " -";
gc.drawString(page, (margins.right - margins.left - gc.textExtent(page).x) / 2 + margins.left, margins.bottom + gc.textExtent(page).y);
for(int index = 0; index <text.length();) {
char c = text.charAt(index);
switch(c) {
case '\r':
if(index < text.length() - 1 && text.charAt(index + 1) == '\n') {
printNewLine(printer, gc, buffer.toString());
buffer.setLength(0);
index += 2;
}
break;
case '\t':
case ' ':
if(gc.textExtent(buffer.toString() + ' ').x > margins.right - margins.left) {
printNewLine(printer, gc, buffer.toString());
buffer.setLength(0);
}
buffer.append(c);
if(index < text.length() - 1 && (!Character.isWhitespace(text.charAt(index + 1)))) { // Looks up one word to see whether the line should wraps here.
String word = readWord(text, index + 1);
if(gc.textExtent(buffer.toString() + word).x > margins.right - margins.left) {
printNewLine(printer, gc, buffer.toString());
buffer.setLength(0);
}
}
index += 1;
break;
default:
buffer.append(c);
index += 1;
}
}
if(buffer.length() > 0) printNewLine(printer, gc, buffer.toString());
if(y + lineHeight <= margins.bottom) printer.endPage();
printer.endJob();
gc.dispose();
font.dispose();
printer.dispose();
}
void printNewLine(Printer printer, GC gc, String line) {
if(y + lineHeight > margins.bottom) {
printer.endPage();
x = margins.left;
y = margins.top;
pageNumber ++;
lineNumber = 1;
String page = "- " + pageNumber + " -";
gc.drawString(page, (margins.right - margins.left - gc.textExtent(page).x) / 2 + margins.left, margins.bottom + gc.textExtent(page).y);
}
gc.drawString(line, x, y);
y += lineHeight;
}
String readWord(String text, int offset) {
StringBuffer sb = new StringBuffer();
int index = offset;
char c = 0;
while(index < text.length()) {
c = text.charAt(index);
if(Character.isWhitespace(c)) break;
sb.append(c);
index += 1;
}
return sb.toString();
}
ImageRegistry imageRegistry = new ImageRegistry();
// private Image getImage(String shortFileName) {
// if (imageRegistry.getDescriptor(shortFileName) == null) {
// ImageDescriptor descriptor =
// ImageDescriptor.createFromFile(null, "C:/icons/" + shortFileName);
// imageRegistry.put(shortFileName, descriptor);
// }
// return imageRegistry.get(shortFileName);
// }
boolean handleChangesBeforeDiscard() {
if (!hasUnsavedChanges)
return true;
MessageBox messageBox =
new MessageBox(
shell,
SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage(
"Do you want to save the changes to "
+ (file == null ? "a file?" : file.getName()));
messageBox.setText(APP_NAME);
int ret = messageBox.open();
if (ret == SWT.YES) {
return saveTextToFile();
} else if (ret == SWT.NO) {
return true;
} else {
return false;
}
}
boolean loadTextFromFile() {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: loading the text from a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
text.setText(sb.toString());
return true;
} catch (IOException e) {
log("Failed to load the text from file: " + file);
log(e.toString());
}
return false;
}
boolean saveTextToFile() {
if (file == null) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
if (lastOpenDirectory != null)
dialog.setFilterPath(lastOpenDirectory);
String selectedFile = dialog.open();
if (selectedFile == null) {
log("Action cancelled: saving the text to a file");
return false;
}
file = new File(selectedFile);
lastOpenDirectory = file.getParent();
}
try {
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();
log("The text has been saved to file: " + file);
hasUnsavedChanges = false;
return true;
} catch (IOException e) {
log("Failed to save the text to file: " + file);
log(e.toString());
}
return false;
}
void log(String message) {
System.out.println(message);
}
public static void main(String[] args) {
new BasicEditor3();
}
}
追加了打印机能,需要下面这个类:
复制代码 代码如下:
package swt_jface.demo11;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.printing.Printer;
public class PrintMargin {
public int left;
public int right;
public int top;
public int bottom;
private PrintMargin(int left, int right, int top, int bottom) {
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;
}
static PrintMargin getPrintMargin(Printer printer, double margin) {
return getPrintMargin(printer, margin, margin, margin, margin);
}
static PrintMargin getPrintMargin(
Printer printer,
double marginLeft,
double marginRight,
double marginTop,
double marginBottom) {
Rectangle clientArea = printer.getClientArea();
Rectangle trim = printer.computeTrim(0, 0, 0, 0);
Point dpi = printer.getDPI();
int leftMargin = (int) (marginLeft * dpi.x) - trim.x;
int rightMargin =
clientArea.width
+ trim.width
- (int) (marginRight * dpi.x)
- trim.x;
int topMargin = (int) (marginTop * dpi.y) - trim.y;
int bottomMargin =
clientArea.height
+ trim.height
- (int) (marginBottom * dpi.y)
- trim.y;
return new PrintMargin(
leftMargin,
rightMargin,
topMargin,
bottomMargin);
}
public String toString() {
return "Margin { "
+ left
+ ", "
+ right
+ "; "
+ top
+ ", "
+ bottom
+ " }";
}
}
阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机