以下是本人设计的java记事本,功能比较简单粗暴,纯粹是为了巩固java IO和GUI的内容不足之处,欢迎各路大神指正!
以下是UI层的代码
//记事本界面层
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;//问题:(此处注释掉变编译不通过)
import javax.swing.*;
import java.awt.datatransfer.*;
import javax.swing.undo.*;
import javax.swing.text.Document;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.event.*;
public class noteBookUI{
//定义一个全局变量用于存储当前打开文件的路径
String nowFileSrc = null;
//执行入口
public static void main(String args[]){
noteBookUI nui = null;
nui = new noteBookUI();
nui.initBO();
}
noteBookBO nbo = null;
//初始化业务对象
public void initBO(){
nbo = new noteBookBO();
}
/**
*以下实现ui界面
*/
JFrame jFrame;
JMenu jm1,jm2,jm3;
JMenuBar jmb;
JMenuItem jmt1,jmt2,jmt3,jmt4,jmt5,jmt6,jmt7,jmt8,jmt9,jmt10,
jmt11,jmt12,jmt13,jmt14,jmt15,jmt16,jmt17;
//文本输入区域
final JTextArea text;JScrollPane jp;
public noteBookUI(){
//主窗口
jFrame = new JFrame("记事本");
//菜单条
jmb=new JMenuBar();
//主菜单
//创建统一字体
Font font_jm=new Font("微软雅黑",Font.PLAIN,20);
jm1=new JMenu("文件");
jm1.setFont(font_jm);
jm2=new JMenu("编辑");
jm2.setFont(font_jm);
jm3=new JMenu("格式");
jm3.setFont(font_jm);
//设置按钮的大小
jm1.setPreferredSize(new Dimension(50,20));
jm2.setPreferredSize(new Dimension(50,20));
jm3.setPreferredSize(new Dimension(50,20));
//定义两个常量,设置按钮的长宽
int WIDTH = 200; //宽度
int HEIGH = 30; //高度
//创建文件菜单下的菜单按钮
//创建字体对象
Font font_jmt=new Font("微软雅黑",Font.PLAIN,20);
jmt1 = new JMenuItem(" 新建(N) Ctrl+N");
jmt1.setFont(font_jmt);
jmt2 = new JMenuItem(" 打开(O) Ctrl+O");
jmt2.setFont(font_jmt);
jmt3 = new JMenuItem(" 保存(S) Ctrl+S");
jmt3.setFont(font_jmt);
jmt4 = new JMenuItem(" 另存为(A)");
jmt4.setFont(font_jmt);
jmt5 = new JMenuItem(" 退出(X)");
jmt5.setFont(font_jmt);
//设置按钮大小
jmt1.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt2.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt3.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt4.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt5.setPreferredSize(new Dimension(WIDTH,HEIGH));
//将相关按钮添加到相关菜单
jm1.add(jmt1);
jm1.add(jmt2);
jm1.add(jmt3);
jm1.add(jmt4);
//创建编辑菜单下的按钮
jmt6 = new JMenuItem(" 撤销(U) Ctrl+Z");
jmt6.setFont(font_jmt);
jmt7 = new JMenuItem(" 剪切(T) Ctrl+X");
jmt7.setFont(font_jmt);
jmt8 = new JMenuItem(" 复制(C) Ctrl+C");
jmt8.setFont(font_jmt);
jmt9 = new JMenuItem(" 粘贴(P) Ctrl+V");
jmt9.setFont(font_jmt);
jmt10 = new JMenuItem(" 删除(L) Del");
jmt10.setFont(font_jmt);
jmt11 = new JMenuItem(" 查找(F) Ctrl+F");
jmt11.setFont(font_jmt);
jmt12 = new JMenuItem(" 查找下一个(N) F3");
jmt12.setFont(font_jmt);
jmt13 = new JMenuItem(" 替换(R) Ctrl+H");
jmt13.setFont(font_jmt);
jmt14 = new JMenuItem(" 替换(A) Ctrl+A");
jmt14.setFont(font_jmt);
//设置按钮大小
jmt6.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt7.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt8.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt9.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt10.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt11.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt12.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt13.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt14.setPreferredSize(new Dimension(WIDTH,HEIGH));
//添加相关按钮到编辑下拉菜单中
jm2.add(jmt6);
jm2.add(jmt7);
jm2.add(jmt8);
jm2.add(jmt9);
jm2.add(jmt10);
jm2.add(jmt11);
jm2.add(jmt12);
jm2.add(jmt13);
jm2.add(jmt14);
//创建格式下拉菜单下的菜单
jmt15 = new JMenuItem(" 自动换行(W)");
jmt15.setFont(font_jmt);
jmt16 = new JMenuItem(" 字体(F)");
jmt16.setFont(font_jmt);
jmt15.setPreferredSize(new Dimension(WIDTH,HEIGH));
jmt16.setPreferredSize(new Dimension(WIDTH,HEIGH));
//添加
jm3.add(jmt15);
jm3.add(jmt16);
jmb.add(jm1);
jmb.add(Box.createHorizontalStrut(50));
jmb.add(jm2);
jmb.add(Box.createHorizontalStrut(50));
jmb.add(jm3);
jFrame.add(jmb);
//添加位置大小属性
jFrame.add(jmb,"North");
//创建滚动输入窗体
text = new JTextArea();
//设置输入框的默认字体
Font font_write = new Font("微软雅黑",Font.PLAIN,20);
text.setFont(font_write);
jp = new JScrollPane(text);
//显示水平(垂直)滚动条
jp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS );
jFrame.add(jp);
//往编辑区域添加撤销相关组件
final UndoManager undo = new UndoManager();
Document doc = text.getDocument();
//注册给定的观察者以便开始接收文档发生不可撤消的编辑的通知
doc.addUndoableEditListener(new UndoableEditListener() {
public void undoableEditHappened(UndoableEditEvent evt) {
undo.addEdit(evt.getEdit());
}
});
//快捷键实现
//新建
text.getActionMap().put("NewFile",new AbstractAction("NewFile") {
public void actionPerformed(ActionEvent evt) {
//新建文件之前弹出是否保存当前文件数据窗口
//beforeCreatFile();
String srcFile = null;
//选择存储路径,弹出路径选择窗口
//srcFile = srcSelect("新建");
srcFile = showSelectSrc_newFile();
//如果用户没有选择路径直接取消操作,则退出该按钮操作
if(srcFile==null){
return ;
}else{
//路径选择好后,弹出文件名字输入框
//String fileName = showGetName();
//调用业务类中的方法创建文件,成功后初始化当前文件路径并弹出提示窗口
nowFileSrc = nbo.doCreateFile(srcFile);
//更改窗体标题为当前文件名
jFrame.setTitle(srcFile);
//创建成功后弹出提示窗口
JOptionPane.showMessageDialog(null, "创建文件成功");
}
}
});
//打开
text.getActionMap().put("Open",new AbstractAction("Open") {
public void actionPerformed(ActionEvent evt) {
String srcFile = null;
srcFile = showSelectSrc_openFile();
//判断是否选择了路径,如果路径选择成功,执行打开操作
if(srcFile!=null){
nowFileSrc = srcFile;
String fileInfo = nbo.doOpen(srcFile);
//将文件的信息传递给文本框
text.setText(fileInfo);
}else{
JOptionPane.showMessageDialog(null, "文件打开失败,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//保存
text.getActionMap().put("Conserver",new AbstractAction("Conserver") {
public void actionPerformed(ActionEvent evt) {
//获取输入文本区域的值
String a = text.getText();
System.out.println(a);
//当前已打开文件,执行保存操作,否则提示创建或打开文件
if(nowFileSrc!=null){
int rtn = nbo.doConserve(nowFileSrc,a);
if(rtn==1){
JOptionPane.showMessageDialog(null, "保存成功!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "保存失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}else{
String src = showSelectSrc_saveOther();
int rtn = nbo.doConserve(src,a);
if(rtn==1){
JOptionPane.showMessageDialog(null, "保存成功!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "保存失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
}
});
//另存为
text.getActionMap().put("SaveAs",new AbstractAction("SaveAs") {
public void actionPerformed(ActionEvent evt) {
//进行所有操作之前先判断用户是否已经打开文件
if(nowFileSrc==null){
showNotOpenFileInfo();
return ;
}else{
//获取输入文本区域的值
String a = text.getText();
//跳转至路径选择界面
String srcFile4 = null;
srcFile4 = showSelectSrc_saveOther();
//判断路径选择操作是否成功
if(srcFile4==null){
return ;
}else{
nbo.doConserve(srcFile4,a);
}
}
}
});
//撤销
text.getActionMap().put("Undo",new AbstractAction("Undo") {
public void actionPerformed(ActionEvent evt) {
try{
if(undo.canUndo()){
undo.undo();
}else{
JOptionPane.showMessageDialog(null, "当前不能进行撤销操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}catch(CannotUndoException e){
//不可撤销后弹出提示信息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//剪切
text.getActionMap().put("JianQie",new AbstractAction("JianQie") {
public void actionPerformed(ActionEvent evt) {
//判断当前编辑区域有无文本
if(text.getText().equals("")){
JOptionPane.showMessageDialog(null, "当前文本编辑区域为空,不能进行剪切操作", "提示", JOptionPane.ERROR_MESSAGE);
}else{
int rtn = nbo.doJianQie(text);
if(rtn == 1){
JOptionPane.showMessageDialog(null, "剪切成功!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "剪切操作失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
}
});
//复制
text.getActionMap().put("Copy",new AbstractAction("Copy") {
public void actionPerformed(ActionEvent evt) {
int rtn = nbo.doCopy(text);
if(rtn == -1){
JOptionPane.showMessageDialog(null, "复制操作失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//粘贴
text.getActionMap().put("Paste",new AbstractAction("Paste") {
public void actionPerformed(ActionEvent evt) {
try{
int rtn = nbo.doPaste(text);
if(rtn==-1){
//剪切板内容不是文本内容
JOptionPane.showMessageDialog(null, "当前内容是非文本,无法粘贴!", "提示", JOptionPane.ERROR_MESSAGE);
}
if(rtn==1){
//剪切板为空
JOptionPane.showMessageDialog(null, "当前剪切板无内容,请先进行复制操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//删除
text.getActionMap().put("Delete",new AbstractAction("Delete") {
public void actionPerformed(ActionEvent evt) {
int rtn = nbo.doDelete(text);
if(rtn == -1){
JOptionPane.showMessageDialog(null, "删除操作失败,请选择您要删除的区域!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//查找
text.getActionMap().put("Search",new AbstractAction("Search") {
public void actionPerformed(ActionEvent evt) {
try{
if("".equals(text.getText())){
//文本编辑区域为空,提示无法查找
JOptionPane.showMessageDialog(null, "当前编辑区域没有内容,无法查找!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
showSearch();
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//查找下一个
text.getActionMap().put("SearchNext",new AbstractAction("SearchNext") {
public void actionPerformed(ActionEvent evt) {
//这里和查找操作一样
try{
if("".equals(text.getText())){
//文本编辑区域为空,提示无法查找
JOptionPane.showMessageDialog(null, "当前编辑区域没有内容,无法查找!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
showSearch();
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//替换
text.getActionMap().put("Replace",new AbstractAction("Replace") {
//这里和查找操作一样
public void actionPerformed(ActionEvent evt) {
try{
if("".equals(text.getText())){
//文本编辑区域为空,提示无法查找
JOptionPane.showMessageDialog(null, "当前编辑区域没有内容,无法查找!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
showSearch();
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//全选
text.getActionMap().put("SelectAll",new AbstractAction("SelectAll") {
public void actionPerformed(ActionEvent evt) {
try{
if("".equals(text.getText())){
//若文本区域没有文本内容,弹出提示框
JOptionPane.showMessageDialog(null, "当前编辑区域没有内容,无法全选!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
nbo.chooseAll(text);
}
}catch(Exception e){
//有异常弹出提示信息
JOptionPane.showMessageDialog(null, "操作出错,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}//标记
}
});
//添加相关事件
text.getInputMap().put(KeyStroke.getKeyStroke("control N"), "NewFile");
text.getInputMap().put(KeyStroke.getKeyStroke("control O"), "Open");
text.getInputMap().put(KeyStroke.getKeyStroke("control S"), "Conserver");
text.getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo");
text.getInputMap().put(KeyStroke.getKeyStroke("control X"), "JianQie");
text.getInputMap().put(KeyStroke.getKeyStroke("control C"), "Copy");
text.getInputMap().put(KeyStroke.getKeyStroke("Del"), "Delete");
text.getInputMap().put(KeyStroke.getKeyStroke("control F"), "Search");
text.getInputMap().put(KeyStroke.getKeyStroke("F3"), "SearchNext");
text.getInputMap().put(KeyStroke.getKeyStroke("control A"), "SelectAll");
//设置窗口属性
jFrame.setVisible(true);
jFrame.setSize(1000, 1000);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//监听相关事件
//监听主菜单按钮
//监听编辑按钮事件,每次单击菜单按钮都需要更新各个按钮是否可操作
jm2.addMenuListener(new MenuListener(){
//由于MenuListener是抽象类,所以实现另外两个方法
public void menuDeselected(MenuEvent e){
return ;
}
public void menuCanceled(MenuEvent e){
return ;
}
public void menuSelected(MenuEvent e){
//更新各个按钮可操作状态
//判断撤销是否可用(为什么不用变成final的?)
System.out.println("Test jm2ActionListen");
jmt6.setEnabled(undo.canUndo());
//判断剪切是否可用
if((text.getText()==null)||(text.getSelectedText()==null)){
jmt7.setEnabled(false);
}
//判断复制是否可用
if((text.getText()==null)||(text.getSelectedText()==null)){
jmt8.setEnabled(false);
}
//判断粘贴是否可用
String value = null;
try{
Clipboard c1 = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable clipT = c1.getContents(null);
value = (String)clipT.getTransferData(DataFlavor.stringFlavor);
}catch(Exception ex){
value = "";
}
if(value.equals("")){
System.out.println("Test jm2ActionListen zhanTie");
jmt9.setEnabled(false);
}
//判断删除是否可用
if(nbo.doDelete(text)!=1){
jmt10.setEnabled(false);
}
}
});
//监听新建按钮事件
jmt1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//新建文件之前弹出是否保存当前文件数据窗口
//beforeCreatFile();
String srcFile = null;
//选择存储路径,弹出路径选择窗口
//srcFile = srcSelect("新建");
srcFile = showSelectSrc_newFile();
//如果用户没有选择路径直接取消操作,则退出该按钮操作
if(srcFile==null){
return ;
}else{
//路径选择好后,弹出文件名字输入框
//String fileName = showGetName();
//调用业务类中的方法创建文件,成功后初始化当前文件路径并弹出提示窗口
nowFileSrc = nbo.doCreateFile(srcFile);
//创建成功后弹出提示窗口
JOptionPane.showMessageDialog(null, "创建文件成功");
}
}
});
//类似地监听其他按钮
//监听打开按钮
jmt2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
String srcFile = null;
srcFile = showSelectSrc_openFile();
//判断是否选择了路径,如果路径选择成功,执行打开操作
if(srcFile!=null){
nowFileSrc = srcFile;
String fileInfo = nbo.doOpen(srcFile);
//将文件的信息传递给文本框
text.setText(fileInfo);
}else{
JOptionPane.showMessageDialog(null, "文件打开失败,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//监听保存
jmt3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//获取输入文本区域的值
String a = text.getText();
System.out.println(a);
//当前已打开文件,执行保存操作,否则提示创建或打开文件
if(nowFileSrc!=null){
int rtn = nbo.doConserve(nowFileSrc,a);
if(rtn==1){
JOptionPane.showMessageDialog(null, "保存成功!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "保存失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}else{
String src = showSelectSrc_saveOther();
int rtn = nbo.doConserve(src,a);
if(rtn==1){
JOptionPane.showMessageDialog(null, "保存成功!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "保存失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
}
});
//监听另存为按钮
jmt4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//进行所有操作之前先判断用户是否已经打开文件
if(nowFileSrc==null){
showNotOpenFileInfo();
return ;
}else{
//获取输入文本区域的值
String a = text.getText();
//跳转至路径选择界面
String srcFile4 = null;
srcFile4 = showSelectSrc_saveOther();
//判断路径选择操作是否成功
if(srcFile4==null){
return ;
}else{
nbo.doConserve(srcFile4,a);
}
}
}
});
/**
*编辑菜单下的按钮监听
*/
//监听撤销按钮
jmt6.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try{
undo.undo();
}catch(CannotRedoException cre){
JOptionPane.showMessageDialog(null, "当前不能进行撤销操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
//更新按钮是否可用
jmt6.setEnabled(undo.canUndo());
}
});
//监听剪切按钮
jmt7.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//判断当前编辑区域有无文本
if(text.getText().equals("")){
JOptionPane.showMessageDialog(null, "当前文本编辑区域为空,不能进行剪切操作", "提示", JOptionPane.ERROR_MESSAGE);
}else{
int rtn = nbo.doJianQie(text);
if(rtn == 1){
JOptionPane.showMessageDialog(null, "剪切成功!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
JOptionPane.showMessageDialog(null, "剪切操作失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
}
});
//监听复制按钮
jmt8.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
int rtn = nbo.doCopy(text);
if(rtn == -1){
JOptionPane.showMessageDialog(null, "复制操作失败,请重新操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//监听粘贴按钮
jmt9.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
try{
int rtn = nbo.doPaste(text);
if(rtn==-1){
//剪切板内容不是文本内容
JOptionPane.showMessageDialog(null, "当前内容是非文本,无法粘贴!", "提示", JOptionPane.ERROR_MESSAGE);
}
if(rtn==1){
//剪切板为空
JOptionPane.showMessageDialog(null, "当前剪切板无内容,请先进行复制操作!", "提示", JOptionPane.ERROR_MESSAGE);
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//监听删除按钮
jmt10.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
int rtn = nbo.doDelete(text);
if(rtn == -1){
JOptionPane.showMessageDialog(null, "删除操作失败,请选择您要删除的区域!", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//监听查找按钮
jmt11.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
try{
if("".equals(text.getText())){
//文本编辑区域为空,提示无法查找
JOptionPane.showMessageDialog(null, "当前编辑区域没有内容,无法查找!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
showSearch();
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//监听查找下一个
jmt12.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
try{
if("".equals(text.getText())){
//文本编辑区域为空,提示无法查找
JOptionPane.showMessageDialog(null, "当前编辑区域没有内容,无法查找!", "提示", JOptionPane.ERROR_MESSAGE);
}else{
showSearch();
}
}catch(Exception e){
//有操作异常,弹出异常消息
JOptionPane.showMessageDialog(null, "操作错误,请重新操作", "提示", JOptionPane.ERROR_MESSAGE);
}
}
});
//监听替换
jmt13.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//首先弹出查找/查找下一个/替换窗口
showReplace();
}
});
//监听全选
jmt14.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//首先弹出查找/查找下一个/替换窗口
nbo.chooseAll(text);
}
});
}
//新建路径选择界面
public String showSelectSrc_newFile(){
FileDialog fd=new FileDialog(new Frame(),"新建",FileDialog.SAVE);
//System.out.println("000");
fd.setVisible(true);
if(fd.getFile()==null||fd.getDirectory()==null){
return null;
}else{
return fd.getDirectory()+fd.getFile();
}
}
//另存为路径选择界面
public String showSelectSrc_saveOther(){
FileDialog fd=new FileDialog(new Frame(),"另存为",FileDialog.SAVE);
//System.out.println("000");
fd.setVisible(true);
if(fd.getFile()==null||fd.getDirectory()==null){
return null;
}else{
return fd.getDirectory()+fd.getFile();
}
}
//打开路径选择界面
public String showSelectSrc_openFile(){
FileDialog fd=new FileDialog(new Frame(),"打开",FileDialog.LOAD);
fd.setVisible(true);
if(fd.getFile()==null||fd.getDirectory()==null){
return null;
}else{
return fd.getDirectory()+fd.getFile();
}
}
//确定提示界面
public void showDoSuccess(String doWhat){
JOptionPane.showConfirmDialog(null, "确定"+doWhat+"?", doWhat, JOptionPane.YES_NO_OPTION);
}
//当前未打开文件时的提示界面
public void showNotOpenFileInfo(){
JOptionPane.showMessageDialog(null, "当前未打开文件,请先打开或者创建相关文件再进行其它操作");
}
/*
//文件名字输入界面,返回相关文件名字(用于重命名和新建功能)
public String showGetName(){
String name = JOptionPane.showInputDialog(null,"请输入文件名字:\n","输入文件名",JOptionPane.PLAIN_MESSAGE);
return name;
}
*/
//进行新操作前(新建文件和关闭窗口)询问是否保存当前数据显示界面
public void beforeCreatFile(){
//弹出该窗口的前提是已经打开了相关文件
if(nowFileSrc!=null){
final JFrame frame_remindSave = new JFrame("记事本");
//创建一个垂直box
Box remindSaveBox = Box.createVerticalBox();
//文字提示信息
JPanel jpanel_remindLabel = new JPanel();
JLabel jlabel_tiShi = new JLabel("是否将更改保存到"+nowFileSrc+"?");
jpanel_remindLabel.add(jlabel_tiShi);
remindSaveBox.add(jpanel_remindLabel);
remindSaveBox.add(Box.createVerticalStrut(5));
//确定和取消按钮
JPanel jpanel_remindButton = new JPanel();
JButton baoCun_btn = new JButton("保存");
JButton fangQi_btn = new JButton("放弃");
jpanel_remindButton.add(baoCun_btn);
jpanel_remindButton.add(fangQi_btn);
remindSaveBox.add(jpanel_remindButton);
frame_remindSave.add(remindSaveBox);
//设置窗口属性
frame_remindSave.setVisible(true);
frame_remindSave.setSize(1000, 200);
frame_remindSave.setResizable(false);
frame_remindSave.setLocation(500,500);
frame_remindSave.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//监听相关按钮
//监听保存按钮
baoCun_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
nbo.doConserve(nowFileSrc,text.getText());
System.out.println("000");
frame_remindSave.dispose();
}
});
//监听放弃按钮
fangQi_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
System.out.println("001");
frame_remindSave.dispose();
}
});
}else{
//当前没有打开文件则直接退出该方法
return ;
}
}
//查找显示界面
//JFrame frame1;
public void showSearch(){
final String [] selectInfo = new String[2];
//默认状态查找是向下查找,查找方框内信息是空
selectInfo[0] = "向下";
selectInfo[1] = "";
JFrame frame1 = new JFrame("查找");
//创建一个垂直box
Box findInfoBox = Box.createVerticalBox();
JPanel jpanel_danXuan = new JPanel();
//文本输入框
JLabel label_fingInfo = new JLabel("查找内容");
final JTextField jtext_findInfo = new JTextField(10);
JPanel findInfo_panel = new JPanel();
findInfo_panel.add(label_fingInfo);
findInfo_panel.add(jtext_findInfo);
findInfoBox.add(findInfo_panel);
findInfoBox.add(Box.createVerticalStrut(10));
//单选按钮
JRadioButton jrb1 = new JRadioButton("向下");
JRadioButton jrb2 = new JRadioButton("向上");
//默认选中的是向下按钮
jrb1.setSelected(true);
ButtonGroup group = new ButtonGroup();
group.add(jrb1);
group.add(jrb2);
jpanel_danXuan.add(jrb1);
jpanel_danXuan.add(jrb2);
findInfoBox.add(jpanel_danXuan);
findInfoBox.add(Box.createVerticalStrut(10));
//确定和取消按钮
JPanel jpanel_queDingQuXiao = new JPanel();
JButton queDing_btn = new JButton("确定");
JButton quXiao_btn = new JButton("取消");
jpanel_queDingQuXiao.add(queDing_btn);
jpanel_queDingQuXiao.add(quXiao_btn);
findInfoBox.add(jpanel_queDingQuXiao);
findInfoBox.add(Box.createVerticalStrut(5));
//提示信息
JPanel jpanel_tiShi = new JPanel();
final JLabel jlabel_tiShi = new JLabel("请输入您要查找的信息");
jlabel_tiShi.setForeground(new Color(238,32,32));
jpanel_tiShi.add(jlabel_tiShi);
findInfoBox.add(jpanel_tiShi);
frame1.add(findInfoBox);
//设置窗口属性
frame1.setVisible(true);
frame1.setSize(1000, 200);
frame1.setResizable(false);
frame1.setLocation(500,500);
frame1.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//添加按钮事件
//监听单选按钮事件
jrb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//将相应的选取的信息赋值给数组selectInfo
selectInfo[0] = "向下";
}
});
jrb2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//将相应的选取的信息赋值给数组selectInfo
selectInfo[0] = "向上";
}
});
//监听确定、取消按钮事件
queDing_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//确定按钮,执行查找操作
selectInfo[1] = jtext_findInfo.getText();
int rtn = nbo.doFindString(text,selectInfo);
/**
*根据返回值,弹出相应的提示信息
*/
if(rtn==0){
//如果输入字符串为空,提示输入为空
jlabel_tiShi.setText("您输入的查找内容为空,请重新输入");
}else if(rtn==1){
//返回1,查找成功
jlabel_tiShi.setText("查找成功");
}else{
//找不到内容
jlabel_tiShi.setText(selectInfo[0]+"查找"+"找不到该内容");
}
}
});
quXiao_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//返回null
return ;
}
});
}
//替换窗口
public void showReplace(){
JFrame frame2 = new JFrame("替换");
//创建一个垂直box
Box replaceBox = Box.createVerticalBox();
//创建查找内容板块
JPanel jpanel_search = new JPanel();
JLabel jlabel_search = new JLabel("查找内容 ");
final JTextField jtext_search = new JTextField(15);
JButton jbutton_search = new JButton("查找下一个");
jpanel_search.add(jlabel_search);
jpanel_search.add(jtext_search);
jpanel_search.add(jbutton_search);
replaceBox.add(jpanel_search);
replaceBox.add(Box.createVerticalStrut(10));
//创建替换内容板块
JPanel jpanel_replace = new JPanel();
JLabel jlabel_replace = new JLabel(" 替换 ");
final JTextField jtext_replace = new JTextField(15);
JButton jbutton_replace = new JButton("替换");
JButton jbutton_replaceall = new JButton("全部替换");
jpanel_replace.add(jlabel_replace);
jpanel_replace.add(jtext_replace);
jpanel_replace.add(jbutton_replace);
jpanel_replace.add(jbutton_replaceall);
replaceBox.add(jpanel_replace);
//创建取消板块以及信息提示板块
JPanel jpanel_cancel = new JPanel();
JButton jbutton_cancel = new JButton("取消");
final JLabel jlabel_tiShi = new JLabel("显示提示信息");
jlabel_tiShi.setForeground(new Color(238,32,32));
jpanel_cancel.add(jbutton_cancel);
replaceBox.add(jpanel_cancel);
replaceBox.add(jlabel_tiShi);
frame2.add(replaceBox);
//设置窗口属性
frame2.setVisible(true);
frame2.setSize(1000, 200);
frame2.setResizable(false);
frame2.setLocation(500,500);
frame2.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//监听按钮事件
//监听查找下一个按钮
//获取查找输入框中的内容
final JTextArea jtext_search1 = text;
jbutton_search.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//由于查找方法传递的参数是字符串数组,所以先创建一个字符串数组用于传递信息
String [] info = new String[2];
info[0] = "向下";
info[1] = jtext_search.getText();
int rtn = nbo.doFindString(text,info);
System.out.println(rtn);
//根据返回值相应显示提示信息
if(rtn==0){
//如果输入字符串为空,提示输入为空
jlabel_tiShi.setText("您输入的查找内容为空,请重新输入");
}else if(rtn==1){
//返回1,查找成功
jlabel_tiShi.setText("查找成功,您可以选择替换");
}else{
//找不到内容
jlabel_tiShi.setText("找不到该内容,该字符可能不存在或者您已将光标移到最后");
}
}
});
//监听替换按钮
jbutton_replace.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
int rtn = nbo.doReplace(jtext_search1,jtext_replace.getText());
if(rtn==0){
jlabel_tiShi.setText("您还没有选中文字,无法执行替换");
}else{
jlabel_tiShi.setText("替换成功");
}
}
});
//监听全部替换按钮
jbutton_replaceall.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
int rtn = nbo.doReplaceAll(text,jtext_search.getText(),jtext_replace.getText());
if(rtn==0){
jlabel_tiShi.setText("请输入替换内容和查找内容");
}else if(rtn==-1){
jlabel_tiShi.setText("找不到内容,请重新输入");
}else{
jlabel_tiShi.setText("全部替换成功");
}
}
});
}
/*
//添加关闭窗口触发时间
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
//弹出询问是否保存修改后的文件
}
});
*/
}
以下是BO业务层代码
//记事本
import java.io.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
import javax.swing.undo.UndoManager;
import java.lang.StringBuffer.*;
public class noteBookBO{
/**
*定义文件菜单下的业务方法
*/
//做到打开文件新建文件将窗口标题改为对应文件路劲,关闭窗口触发时间没有实现
noteBookDA nda = new noteBookDA();
//定义新建方法
public String doCreateFile(String srcFile){
String src = null;
System.out.println("test doCreatFile"+srcFile);
try{
File f = nda.creatFile(srcFile);
src = f.getAbsolutePath();
System.out.println(src);
}catch(IOException ie){
System.out.println(ie);
}
//获取当前文件的路径并返回
return src;
}
//定义打开方法
public String doOpen(String srcFile){
String rtn = null;
try{
rtn = nda.dataRead(srcFile);
}catch(IOException ie){
System.out.println(ie);
}
return rtn;
}
//定义保存方法,如果所传递的文件路径所指文件不存在,则对应返回-1,如果保存成功,返回1
public int doConserve(String srcFile,String data){
int rtn;
try{
nda.dataWrite(srcFile,data);
rtn = 1;
}catch(Exception ie){
rtn = -1;
}
return rtn;
}
//定义另存为方法
public void doNewConserve(String srcFile,String data) {
try{
nda.dataWrite(srcFile,data);
}catch(IOException ie){
System.out.println(ie);
}
}
//定义退出方法
public void quit(){
System.exit(0);
}
/**
*定义编辑菜单下的业务方法
*/
//定义撤销的方法,返回1表示撤销成功,返回0表示撤销失败
public int doCeXiao(JTextArea text){
System.out.println("000");
UndoManager undoManager = new UndoManager();
text.getDocument().addUndoableEditListener(undoManager);
if(undoManager.canUndo()){
System.out.println("001");
undoManager.undo();
return 1;
}else{
System.out.println("002");
return 0;
}
}
//定义剪切方法,成功返回1,失败返回-1
public int doJianQie(JTextArea text){
//先copy
int rtn_copy = doCopy(text);
//后delete
int rtn_delete = doDelete(text);
if((rtn_copy) ==1&&(rtn_delete==1)){
return 1;
}else{
return -1;
}
}
//定义复制方法
//获取系统剪贴板,成功返回1,没有选中操作的文本区域,返回-1
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
final Clipboard c1 = clipboard;
public int doCopy(JTextArea text){
String temp = text.getSelectedText();
if(temp==null){
return -1;
}else{
StringSelection textString = new StringSelection(temp);
//Clipboard clipboard = new Clipboard(temp);
c1.setContents(textString, null);
return 1;
}
}
/*定义粘贴方法,返回1表示操作成功,返回0表示剪切板空白
*返回-1表示粘贴内容是非文本
*出现相应的异常,相应地返回-2和-3
*/
public int doPaste(JTextArea text){
// 获取剪切板中的内容
try{
Transferable clipT = c1.getContents(null);
String value = null;
if (clipT != null){
// 检查内容是否是文本类型
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor)){
//获取剪切板中的数据
value = (String)clipT.getTransferData(DataFlavor.stringFlavor);
//执行替换操作
int start = text.getSelectionStart();
int end = text.getSelectionEnd();
text.replaceRange(value, start, end);
return 1;
}else{
//粘贴内容非文本返回-1
return -1;
}
}else{
//剪切板为空返回0
return 0;
}
}catch(UnsupportedFlavorException ufe){
//捕获到此异常表示操作不支持该数据类型,返回-2
return -2;
}catch(IOException ie){
//捕获到此异常表示IO操作有问题,返回-3
return -3;
}
}
//定义删除方法,成功返回1,如果没有选定操作的文本区域,返回-1
public int doDelete(JTextArea text){
int start = text.getSelectionStart();
int end = text.getSelectionEnd();
// 删除被选取的文本
if(start==end){
return -1;
}else{
text.replaceRange("", start, end);
return 1;
}
}
//定义查找方法,查找成功返回1,查找内容为空返回0,找不到该字符串返回-1
int start ;
int end ;
public int doFindString(JTextArea text,String [] searchValue ){
if("".equals(searchValue[1])){
//为空,返回0
return 0;
}else{
//判断是向下还是向上搜索,如果是向上,将字符串反转
//获取当前光标的位置
int caretPosition;
if(searchValue[0].equals("向上")){
if((text.getSelectedText()!=null)&&(text.getSelectedText().equals(searchValue[1]))){
//如果文本选中了要查找的值,说明已经进行过查找操作,此时光标位置应该移动到start处
caretPosition = start;
}else{
//如果还没有进行查找操作,应该获取当前光标的位置
caretPosition = text.getCaretPosition();
}
//先将字符串反转
String text1 = text.getText();
StringBuffer StringBuffer1 = new StringBuffer(text1);
String textReverse = StringBuffer1.reverse().toString();
//同时当前光标对应的位置也应该对应改变
caretPosition = text1.length() - caretPosition;
//查找前,查找的信息也需要反转
StringBuffer StringBuffer2 = new StringBuffer(searchValue[1]);
String infoReverse = StringBuffer2.reverse().toString();
/**
*执行查找操作,在操作中,由于字符串被反转
*所以将字符串长度减去得出来的索引对应的是原字符串
*的end的值
*/
end = textReverse.length() - textReverse.indexOf(infoReverse, caretPosition);
start = end - infoReverse.length();
//选中文本
if(end>textReverse.length()){
//end值大于文本长度,表示该文本不存在
return -1;
}else{
//查找成功,选中文本
text.select(start,end);
return 1;
}
}else{
String getInfo = text.getText();
caretPosition = text.getCaretPosition();
//查找对应的字符
start = getInfo.indexOf(searchValue[1], caretPosition);
end = getInfo.indexOf(searchValue[1], caretPosition) + searchValue[1].length();
//选中文本
if(start==-1){
//文本不存在
return -1;
}else{
//查找成功
text.select(start,end);
return 1;
}
}
}
}
//定义替换,返回0表示没有选中文本,返回1表示替换成功
public int doReplace(JTextArea text,String replaceInfo){
if(text.getSelectedText()==null){
return 0;
}else{
//执行替换操作
text.replaceRange(replaceInfo, start, end);
return 1;
}
}
//定义全部替换方法,输入为空,返回0,成功替换全部返回1,找不到相应的字符返回-1
public int doReplaceAll(JTextArea text,String regex,String replacement){
String textInfo = text.getText();
if("".equals(textInfo)||"".equals(regex)){
return 0;
}else{
if(textInfo.indexOf(regex)!=-1){
//如果替换的字符串存在,则执行替换操作
String textDoneReplace = textInfo.replaceAll(regex,replacement);
//替换完之后将数据写进输入区域
text.setText(textDoneReplace);
return 1;
}else{
return -1;
}
}
}
//定义全选
public void chooseAll(JTextArea text){
text.selectAll();
}
}
以下是DA数据层代码
//数据层面
import java .io.*;
public class noteBookDA{
//主方法,测试用
public static void main(String [] args){
noteBookDA test = new noteBookDA();
// try{
// //String st = test.dataRead("text.txt");
// //System.out.println(st);
// //String st = new String("asldfkjlsdkfj");
// //test.dataWrite("text.txt",st);
// //test.creatFile("D:/HaiGe/mycode/L2-W4/代码练习/test","name1");
// }catch(IOException ie){
// System.out.println("IOException");
// }
}
//定义数据操作方法
//在指定目录创建新文件
public File creatFile(String src) throws IOException{
String fileSrc = src;
File f = new File(fileSrc);
if(f.exists()){
return null;
}else{
try{
// 创建新文件
f.createNewFile();
}catch (IOException e){
System.out.println("创建新文件时出现了错误。。。");
e.printStackTrace();
}
return f;
}
}
//定义数据读取方法,返回读取到的数据的字符串
public String dataRead(String srcFile) throws IOException{
String dataString;
File f = new File(srcFile);
FileReader fr = new FileReader(f);
char [] cbuf = new char[(int)f.length()];
fr.read(cbuf);
dataString = new String(cbuf);
fr.close();
return dataString;
}
//定义数据写入方法
public void dataWrite(String srcFile,String writeData) throws IOException{
String dataString;
File f = new File(srcFile);
FileWriter fw = new FileWriter(f);
fw.write(writeData);
fw.close();
}
//定义数据替换
public void dataReplace(String srcFile,String oldData,String newData) throws IOException{
//Fiel f= new File(srcFile);
}
//数据查找
public void dataSearch(String allData,String tarData){
}
//定义数据删除
public void dataDelete(String srcFile,String deleteData){
//String da = dataRead(srcFile);
}
}
该记事本只是实现了简单的输入编辑保存等基本操作,主要用于巩固IO和UI的知识,不足之处,恳请各位指出!