java实现极简单的 TXT小说阅读器(第四版)

第四版在第三版的基础上增加了

对word文档打开的支持。


主要使用了jacob.jar包以及jacob.dll。

将jacob.dll放入系统目录下。

导入jacob.jar包入工程即可。


MSWordManager类:

public class MSWordManager { 
        // word文档 
        private Dispatch doc; 
        // word运行程序对象 
        private ActiveXComponent word; 
        // 所有word文档集合 
        private Dispatch documents; 
        // 选定的范围或插入点 
        private Dispatch selection; 
        private boolean saveOnExit = true; 
        /** *//** 
         *     
         * @param visible 为true表示word应用程序可见 
         */ 
        public MSWordManager(boolean visible) { 
                if (word == null) { 
                        word = new ActiveXComponent("Word.Application"); 
                        word.setProperty("Visible", new Variant(visible)); 
                } 
                if (documents == null) 
                        documents = word.getProperty("Documents").toDispatch(); 
        } 
        /** *//** 
         * 设置退出时参数 
         *     
         * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件 
         */ 
        public void setSaveOnExit(boolean saveOnExit) { 
                this.saveOnExit = saveOnExit; 
        } 
        /** *//** 
         * 创建一个新的word文档 
         *     
         */ 
        public void createNewDocument() { 
                doc = Dispatch.call(documents, "Add").toDispatch(); 
                selection = Dispatch.get(word, "Selection").toDispatch(); 
        } 
        /** *//** 
         * 打开一个已存在的文档 
         *     
         * @param docPath 
         */ 
        public void openDocument(String docPath) { 
                closeDocument(); 
                doc = Dispatch.call(documents, "Open", docPath).toDispatch(); 
                selection = Dispatch.get(word, "Selection").toDispatch(); 
        } 
        /** *//** 
         * 把选定的内容或插入点向上移动 
         *     
         * @param pos 移动的距离 
         */ 
        public void moveUp(int pos) { 
                if (selection == null) 
                        selection = Dispatch.get(word, "Selection").toDispatch(); 
                for (int i = 0; i<pos; i++) 
                        Dispatch.call(selection, "MoveUp"); 
        } 
        /** *//** 
         * 把选定的内容或者插入点向下移动 
         *     
         * @param pos 移动的距离 
         */ 
        public void moveDown(int pos) { 
                if (selection == null) 
                        selection = Dispatch.get(word, "Selection").toDispatch(); 
                for (int i = 0; i<pos; i++) 
                        Dispatch.call(selection, "MoveDown"); 
        } 
        /** *//** 
         * 把选定的内容或者插入点向左移动 
         *     
         * @param pos 移动的距离 
         */ 
        public void moveLeft(int pos) { 
                if (selection == null) 
                        selection = Dispatch.get(word, "Selection").toDispatch(); 
                for (int i = 0; i<pos; i++) { 
                        Dispatch.call(selection, "MoveLeft"); 
                } 
        } 
        /** *//** 
         * 把选定的内容或者插入点向右移动 
         *     
         * @param pos 移动的距离 
         */ 
        public void moveRight(int pos) { 
                if (selection == null) 
                        selection = Dispatch.get(word, "Selection").toDispatch(); 
                for (int i = 0; i<pos; i++) 
                        Dispatch.call(selection, "MoveRight"); 
        } 
        /** *//** 
         * 把插入点移动到文件首位置 
         *     
         */ 
        public void moveStart() { 
                if (selection == null) 
                        selection = Dispatch.get(word, "Selection").toDispatch(); 
                Dispatch.call(selection, "HomeKey", new Variant(6)); 
        }         
        public void moveEnd() { 
                if (selection == null) 
                        selection = Dispatch.get(word, "Selection").toDispatch(); 
                Dispatch.call(selection, "EndKey", new Variant(6)); 
        } 
        /** *//** 
         * 从选定内容或插入点开始查找文本 
         *     
         * @param toFindText 要查找的文本 
         * @return boolean true-查找到并选中该文本,false-未查找到文本 
         */ 
        public boolean find(String toFindText) { 
                if (toFindText == null || toFindText.equals("")) 
                        return false; 
                // 从selection所在位置开始查询 
                Dispatch find = word.call(selection, "Find").toDispatch(); 
                // 设置要查找的内容 
                Dispatch.put(find, "Text", toFindText); 
                // 向前查找 
                Dispatch.put(find, "Forward", "True"); 
                // 设置格式 
                Dispatch.put(find, "Format", "True"); 
                // 大小写匹配 
                Dispatch.put(find, "MatchCase", "True"); 
                // 全字匹配 
                Dispatch.put(find, "MatchWholeWord", "True"); 
                // 查找并选中 
                return Dispatch.call(find, "Execute").getBoolean(); 
        } 
        /** *//** 
         * 把选定选定内容设定为替换文本 
         *     
         * @param toFindText 查找字符串 
         * @param newText 要替换的内容 
         * @return 
         */ 
        public boolean replaceText(String toFindText, String newText) { 
                if (!find(toFindText)) 
                        return false; 
                Dispatch.put(selection, "Text", newText); 
                return true; 
        } 
        /** *//** 
         * 全局替换文本 
         *     
         * @param toFindText 查找字符串 
         * @param newText 要替换的内容 
         */ 
        public void replaceAllText(String toFindText, String newText) { 
                while (find(toFindText)) { 
                        Dispatch.put(selection, "Text", newText); 
                        Dispatch.call(selection, "MoveRight"); 
                } 
        }
        /** *//** 
         * 在当前插入点插入字符串 
         *     
         * @param newText 要插入的新字符串 
         */ 
        public void insertText(String newText) { 
                Dispatch.put(selection, "Text", newText); 
        } 
        /** *//** 
         *     
         * @param toFindText 要查找的字符串 
         * @param imagePath 图片路径 
         * @return 
         */ 
        public boolean replaceImage(String toFindText, String imagePath) { 
                if (!find(toFindText)) 
                        return false; 
                Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), 
                                "AddPicture", imagePath); 
                return true; 
        } 
        /** *//** 
         * 全局替换图片 
         *     
         * @param toFindText 查找字符串 
         * @param imagePath 图片路径 
         */ 
        public void replaceAllImage(String toFindText, String imagePath) { 
                while (find(toFindText)) { 
                        Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), 
                                        "AddPicture", imagePath); 
                        Dispatch.call(selection, "MoveRight"); 
                } 
        } 
        /** *//** 
         * 在当前插入点插入图片 
         *     
         * @param imagePath 图片路径 
         */ 
        public void insertImage(String imagePath) { 
                Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), 
                                "AddPicture", imagePath); 
        } 
        /** *//** 
         * 合并单元格 
         *     
         * @param tableIndex 
         * @param fstCellRowIdx 
         * @param fstCellColIdx 
         * @param secCellRowIdx 
         * @param secCellColIdx 
         */ 
        public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx, 
                        int secCellRowIdx, int secCellColIdx) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                Dispatch fstCell = Dispatch.call(table, "Cell", 
                                new Variant(fstCellRowIdx), new Variant(fstCellColIdx)) 
                                .toDispatch(); 
                Dispatch secCell = Dispatch.call(table, "Cell", 
                                new Variant(secCellRowIdx), new Variant(secCellColIdx)) 
                                .toDispatch(); 
                Dispatch.call(fstCell, "Merge", secCell); 
        } 
        /** *//** 
         * 在指定的单元格里填写数据 
         *     
         * @param tableIndex 
         * @param cellRowIdx 
         * @param cellColIdx 
         * @param txt 
         */ 
        public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx, 
                        String txt) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), 
                                new Variant(cellColIdx)).toDispatch(); 
                Dispatch.call(cell, "Select"); 
                Dispatch.put(selection, "Text", txt); 
        } 
        /** *//** 
         * 在当前文档拷贝数据 
         *     
         * @param pos 
         */ 
        public void copy(String toCopyText) { 
                moveStart(); 
                if (this.find(toCopyText)) { 
                        Dispatch textRange = Dispatch.get(selection, "Range").toDispatch(); 
                        Dispatch.call(textRange, "Copy"); 
                } 
        } 
        /** *//** 
         * 在当前文档粘帖剪贴板数据 
         *     
         * @param pos 
         */ 
        public void paste(String pos) { 
                moveStart(); 
                if (this.find(pos)) { 
                        Dispatch textRange = Dispatch.get(selection, "Range").toDispatch(); 
                        Dispatch.call(textRange, "Paste"); 
                } 
        } 
        /** *//** 
         * 在当前文档指定的位置拷贝表格 
         *     
         * @param pos 当前文档指定的位置 
         * @param tableIndex 被拷贝的表格在word文档中所处的位置 
         */ 
        public void copyTable(String pos,int tableIndex) { 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                Dispatch range = Dispatch.get(table, "Range").toDispatch(); 
                Dispatch.call(range, "Copy"); 
                if (this.find(pos)) { 
                        Dispatch textRange = Dispatch.get(selection, "Range").toDispatch(); 
                        Dispatch.call(textRange, "Paste"); 
                } 
        } 
        /** *//** 
         * 在当前文档末尾拷贝来自另一个文档中的段落 
         *     
         * @param anotherDocPath 另一个文档的磁盘路径 
         * @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始) 
         */ 
        public void copyParagraphFromAnotherDoc(String anotherDocPath, 
                        int paragraphIndex) { 
                Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); // 取得当前文档的内容 
                Dispatch.call(wordContent, "InsertAfter", "$selection$");// 插入特殊符定位插入点 
                copyParagraphFromAnotherDoc(anotherDocPath, paragraphIndex, 
                                "$selection$"); 
        } 
        /** *//** 
         * 在当前文档指定的位置拷贝来自另一个文档中的段落 
         *     
         * @param anotherDocPath 另一个文档的磁盘路径 
         * @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始) 
         * @param pos 当前文档指定的位置 
         */ 
        public void copyParagraphFromAnotherDoc(String anotherDocPath, 
                        int paragraphIndex, String pos) { 
                Dispatch doc2 = null; 
                try { 
                        doc2 = Dispatch.call(documents, "Open", anotherDocPath) 
                                        .toDispatch(); 
                        Dispatch paragraphs = Dispatch.get(doc2, "Paragraphs").toDispatch(); 

                        Dispatch paragraph = Dispatch.call(paragraphs, "Item", 
                                        new Variant(paragraphIndex)).toDispatch(); 
                        Dispatch range = Dispatch.get(paragraph, "Range").toDispatch(); 
                        Dispatch.call(range, "Copy"); 
                        if (this.find(pos)) { 
                                Dispatch textRange = Dispatch.get(selection, "Range") 
                                                .toDispatch(); 
                                Dispatch.call(textRange, "Paste"); 
                        } 
                } catch (Exception e) { 
                        e.printStackTrace(); 
                } finally { 
                        if (doc2 != null) { 
                                Dispatch.call(doc2, "Close", new Variant(saveOnExit)); 
                                doc2 = null; 
                        } 
                } 
        } 
        /** *//** 
         * 在当前文档指定的位置拷贝来自另一个文档中的表格 
         *     
         * @param anotherDocPath 另一个文档的磁盘路径 
         * @param tableIndex 被拷贝的表格在另一格文档中的序号(从1开始) 
         * @param pos 当前文档指定的位置 
         */ 
        public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex, 
                        String pos) { 
                Dispatch doc2 = null; 
                try { 
                        doc2 = Dispatch.call(documents, "Open", anotherDocPath) 
                                        .toDispatch(); 
                        Dispatch tables = Dispatch.get(doc2, "Tables").toDispatch(); 
                        Dispatch table = Dispatch.call(tables, "Item", 
                                        new Variant(tableIndex)).toDispatch(); 
                        Dispatch range = Dispatch.get(table, "Range").toDispatch(); 
                        Dispatch.call(range, "Copy"); 
                        if (this.find(pos)) { 
                                Dispatch textRange = Dispatch.get(selection, "Range") 
                                                .toDispatch(); 
                                Dispatch.call(textRange, "Paste"); 
                        } 
                } catch (Exception e) { 
                        e.printStackTrace(); 
                } finally { 
                        if (doc2 != null) { 
                                Dispatch.call(doc2, "Close", new Variant(saveOnExit)); 
                                doc2 = null; 
                        } 
                } 
        } 
        /** *//** 
         * 在当前文档指定的位置拷贝来自另一个文档中的图片 
         *     
         * @param anotherDocPath 另一个文档的磁盘路径 
         * @param shapeIndex 被拷贝的图片在另一格文档中的位置 
         * @param pos 当前文档指定的位置 
         */ 
        public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex, 
                        String pos) { 
                Dispatch doc2 = null; 
                try { 
                        doc2 = Dispatch.call(documents, "Open", anotherDocPath) 
                                        .toDispatch(); 
                        Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch(); 
                        Dispatch shape = Dispatch.call(shapes, "Item", 
                                        new Variant(shapeIndex)).toDispatch(); 
                        Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch(); 
                        Dispatch.call(imageRange, "Copy"); 
                        if (this.find(pos)) { 
                                Dispatch textRange = Dispatch.get(selection, "Range") 
                                                .toDispatch(); 
                                Dispatch.call(textRange, "Paste"); 
                        } 
                } catch (Exception e) { 
                        e.printStackTrace(); 
                } finally { 
                        if (doc2 != null) { 
                                Dispatch.call(doc2, "Close", new Variant(saveOnExit)); 
                                doc2 = null; 
                        } 
                } 
        } 
        /** *//** 
         * 创建表格 
         *     
         * @param pos    位置 
         * @param cols 列数 
         * @param rows 行数 
         */ 
        public void createTable(int numCols, int numRows){//(String pos, int numCols, int numRows) { 
//                if (!find(pos)) { 
                        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                        Dispatch range = Dispatch.get(selection, "Range").toDispatch(); 
                        Dispatch newTable = Dispatch.call(tables, "Add", range, 
                                        new Variant(numRows), new Variant(numCols)).toDispatch(); 
                        Dispatch.call(selection, "MoveRight"); 
                        moveEnd(); 
//                } 
        } 
        /** *//** 
         * 在指定行前面增加行 
         *     
         * @param tableIndex word文件中的第N张表(从1开始) 
         * @param rowIndex 指定行的序号(从1开始) 
         */ 
        public void addTableRow(int tableIndex, int rowIndex) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); 
                Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex)) 
                                .toDispatch(); 
                Dispatch.call(rows, "Add", new Variant(row)); 
        } 
        /** *//** 
         * 在第1行前增加一行 
         *     
         * @param tableIndex word文档中的第N张表(从1开始) 
         */ 
        public void addFirstTableRow(int tableIndex) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); 
                Dispatch row = Dispatch.get(rows, "First").toDispatch(); 
                Dispatch.call(rows, "Add", new Variant(row)); 
        } 
        /** *//** 
         * 在最后1行前增加一行 
         *     
         * @param tableIndex 
         *                        word文档中的第N张表(从1开始) 
         */ 
        public void addLastTableRow(int tableIndex) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); 
                Dispatch row = Dispatch.get(rows, "Last").toDispatch(); 
                Dispatch.call(rows, "Add", new Variant(row)); 
        } 
        /** *//** 
         * 增加一行 
         *     
         * @param tableIndex word文档中的第N张表(从1开始) 
         */ 
        public void addRow(int tableIndex) { 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); 
                Dispatch.call(rows, "Add"); 
        } 
        /** *//** 
         * 增加一列 
         *     
         * @param tableIndex word文档中的第N张表(从1开始) 
         */ 
        public void addCol(int tableIndex) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); 
                Dispatch.call(cols, "Add").toDispatch(); 
                Dispatch.call(cols, "AutoFit"); 
        } 
        /** *//** 
         * 在指定列前面增加表格的列 
         *     
         * @param tableIndex word文档中的第N张表(从1开始) 
         * @param colIndex    指定列的序号 (从1开始) 
         */ 
        public void addTableCol(int tableIndex, int colIndex) { 
                // 所有表格 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); 
                System.out.println(Dispatch.get(cols, "Count")); 
                Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex)) 
                                .toDispatch(); 
                // Dispatch col = Dispatch.get(cols, "First").toDispatch(); 
                Dispatch.call(cols, "Add", col).toDispatch(); 
                Dispatch.call(cols, "AutoFit"); 
        } 
        /** *//** 
         * 在第1列前增加一列 
         *     
         * @param tableIndex word文档中的第N张表(从1开始) 
         */ 
        public void addFirstTableCol(int tableIndex) { 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); 
                Dispatch col = Dispatch.get(cols, "First").toDispatch(); 
                Dispatch.call(cols, "Add", col).toDispatch(); 
                Dispatch.call(cols, "AutoFit"); 
        } 
        /** *//** 
         * 在最后一列前增加一列 
         *     
         * @param tableIndex word文档中的第N张表(从1开始) 
         */ 
        public void addLastTableCol(int tableIndex) { 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                // 要填充的表格 
                Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)) 
                                .toDispatch(); 
                // 表格的所有行 
                Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); 
                Dispatch col = Dispatch.get(cols, "Last").toDispatch(); 
                Dispatch.call(cols, "Add", col).toDispatch(); 
                Dispatch.call(cols, "AutoFit"); 
        } 
        /** *//** 
         * 自动调整表格 
         *     
         */ 
        public void autoFitTable() { 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                int count = Dispatch.get(tables, "Count").toInt(); 
                for (int i = 0; i < count; i++) { 
                        Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)) 
                                        .toDispatch(); 
                        Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); 
                        Dispatch.call(cols, "AutoFit"); 
                } 
        } 
        /** *//** 
         * 调用word里的宏以调整表格的宽度,其中宏保存在document下 
         *     
         */ 
        public void callWordMacro() { 
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch(); 
                int count = Dispatch.get(tables, "Count").toInt(); 
                Variant vMacroName = new Variant("Normal.NewMacros.tableFit"); 
                Variant vParam = new Variant("param1"); 
                Variant para[] = new Variant[] { vMacroName }; 
                for (int i = 0; i <para.length; i++) { 
                        Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)) 
                                        .toDispatch(); 
                        Dispatch.call(table, "Select"); 
                        Dispatch.call(word, "Run", "tableFitContent"); 
                } 
        } 
        /** *//** 
         * 设置当前选定内容的字体 
         *     
         * @param boldSize 
         * @param italicSize 
         * @param underLineSize 下划线 
         * @param colorSize 字体颜色 
         * @param size 字体大小 
         * @param name 字体名称 
         */ 
        public void setFont(boolean bold, boolean italic, boolean underLine, 
                        String colorSize, String size, String name) { 
                Dispatch font = Dispatch.get(selection, "Font").toDispatch(); 
                Dispatch.put(font, "Name", new Variant(name)); 
                Dispatch.put(font, "Bold", new Variant(bold)); 
                Dispatch.put(font, "Italic", new Variant(italic)); 
                Dispatch.put(font, "Underline", new Variant(underLine)); 
                Dispatch.put(font, "Color", colorSize); 
                Dispatch.put(font, "Size", size); 
        } 
        /** *//** 
         * 文件保存或另存为 
         *     
         * @param savePath 保存或另存为路径 
         */ 
        public void save(String savePath) { 
                Dispatch.call( 
                                (Dispatch) Dispatch.call(word, "WordBasic").getDispatch(), 
                                "FileSaveAs", savePath); 
        } 
        /** *//** 
         * 关闭当前word文档 
         *     
         */ 
        public void closeDocument() { 
                if (doc != null) { 
                        Dispatch.call(doc, "Save"); 
                        Dispatch.call(doc, "Close", new Variant(saveOnExit)); 
                        doc = null; 
                } 
        } 
        /** *//** 
         * 关闭全部应用 
         *     
         */ 
        public void close() { 
                closeDocument(); 
                if (word != null) { 
                        Dispatch.call(word, "Quit"); 
                        word = null; 
                } 
                selection = null; 
                documents = null; 
        } 
        /** *//** 
         * 打印当前word文档 
         *     
         */ 
        public void printFile() { 
                if (doc != null) { 
                        Dispatch.call(doc, "PrintOut"); 
                } 
        }      
}


Display_txt类:

public class Display_txt extends JFrame {
	
	JFrame jframe = new JFrame();
	JTextArea content,wordSizeSetArea,wordStyleSetArea,wordNameSetArea;
	JMenuBar menubar = new JMenuBar();
	JMenu menu_file = new JMenu("文件");
	JMenu menu_about = new JMenu("关于");
	JMenuItem menuItem_open = new JMenuItem("打开");
	JMenuItem menuItem_save = new JMenuItem("保存");
	JMenuItem menuItem_saveAs = new JMenuItem("另存为");
	JMenuItem menuItem_exit = new JMenuItem("退出");
	JMenuItem menuItem_about = new JMenuItem("软件说明");
	
	boolean flag = true;
	String str_filePath = null;
	
	
	public Display_txt(){
		//文字输入框(文字显示窗口)
		content = new JTextArea(10,50);
		content.setAutoscrolls(true);
		JScrollPane contentScroll = new JScrollPane(content);
		content.setBorder(BorderFactory.createBevelBorder(1));
		JPanel upper = new JPanel(new BorderLayout());
		upper.add(contentScroll);
		//字体大小设置窗口
		wordSizeSetArea = new JTextArea(1,3);
		wordSizeSetArea.setBorder(BorderFactory.createBevelBorder(1));
		wordSizeSetArea.setText("12");
		//字体样式设置窗口(加粗等)
		wordStyleSetArea = new JTextArea(1,3);
		wordStyleSetArea.setBorder(BorderFactory.createBevelBorder(1));
		wordStyleSetArea.setText("0");
		//字体名字设置窗口(宋体等)
		wordNameSetArea = new JTextArea(1,3);
		wordNameSetArea.setBorder(BorderFactory.createBevelBorder(1));
		wordNameSetArea.setText("宋体");
		//(菜单栏)文件——打开
		menuItem_open.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				try{
					JFileChooser jfc = new JFileChooser();
					if(jfc.showOpenDialog(jframe)==JFileChooser.APPROVE_OPTION ){
						str_filePath = jfc.getSelectedFile().getAbsolutePath();
						//打开TXT
						if(str_filePath.contains(".txt"))
						{
							BufferedReader bufferedReader = new BufferedReader(new FileReader(str_filePath));
							String str_line;
							while((str_line=bufferedReader.readLine())!=null){
								if(flag){
									content.setText(str_line);
									flag = false;
								}
								else{
									content.setText(content.getText()+"\n"+str_line);
								}
							}
							bufferedReader.close();
						//打开word文件
						}else if(str_filePath.contains(".doc")||str_filePath.contains(".docx")){
							MSWordManager ms=new MSWordManager(true);        
			                ms.openDocument(str_filePath);
						}
					}
				}catch(FileNotFoundException e1){
					e1.printStackTrace();
				}catch(IOException e2){
					e2.printStackTrace();
				}
			}
		});
		//按钮
		JButton wordSizeSet = new JButton("设置字体大小");
		wordSizeSet.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				try{
					WordStyleSet.StyleSet(content,wordNameSetArea.getText(),Integer.parseInt(wordStyleSetArea.getText()),Integer.parseInt(wordSizeSetArea.getText()));
				}catch(Exception e0){
					e0.printStackTrace();				
				}
			}
		});
		//按钮
		JButton wordStyleSet = new JButton("设置字体样式");
		wordStyleSet.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				try{
					WordStyleSet.StyleSet(content,wordNameSetArea.getText(),Integer.parseInt(wordStyleSetArea.getText()),Integer.parseInt(wordSizeSetArea.getText()));
				}catch(Exception e0){
					e0.printStackTrace();				
				}
			}
		});
		//按钮
		JButton wordNameSet = new JButton("设置字体名字");
		wordNameSet.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				try{
					WordStyleSet.StyleSet(content,wordNameSetArea.getText(),Integer.parseInt(wordStyleSetArea.getText()),Integer.parseInt(wordSizeSetArea.getText()));
				}catch(Exception e0){
					e0.printStackTrace();				
				}
			}
		});
		//(菜单栏)文件——另存为
		menuItem_saveAs.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				JFileChooser jfc = new JFileChooser();
				if(jfc.showSaveDialog(jframe)==JFileChooser.APPROVE_OPTION )
					new SaveAndSaveAs(content,jfc.getSelectedFile().getPath());
			}
		});
		//(菜单栏)文件——保存
		menuItem_save.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				new SaveAndSaveAs(content,str_filePath);
			}
		});
		//(菜单栏)文件——退出
		menuItem_exit.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}	
		});
		//(菜单栏)关于——软件说明
		menuItem_about.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				JOptionPane.showMessageDialog(jframe, "版本1.0    作者:snnile","软件说明", JOptionPane.INFORMATION_MESSAGE); 
			}
		});
				
		menu_file.add(menuItem_open);
		menu_file.add(menuItem_save);
		menu_file.add(menuItem_saveAs);
		menu_file.add(menuItem_exit);
		menubar.add(menu_file);
		menu_about.add(menuItem_about);
		menubar.add(menu_about);
		JPanel buttonp = new JPanel();
		buttonp.add(wordSizeSet);
		buttonp.add(wordSizeSetArea);
		buttonp.add(wordStyleSet);
		buttonp.add(wordStyleSetArea);
		buttonp.add(wordNameSet);
		buttonp.add(wordNameSetArea);
		JPanel all = new JPanel(new GridLayout(1,1));
		all.add(upper);
		jframe.add(menubar,BorderLayout.NORTH);
		jframe.add(buttonp,BorderLayout.SOUTH);
		jframe.add(all,BorderLayout.CENTER);
		jframe.pack();
		Toolkit tool = Toolkit.getDefaultToolkit();
		Dimension screen = tool.getScreenSize();
		jframe.setLocation(screen.width/2-jframe.getWidth()/2,screen.height/2-jframe.getHeight()/2);
		jframe.setTitle("TXT小说阅读器");
		jframe.setVisible(true);
		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String args[]){
		Display_txt display_demo = new Display_txt();
	}

}

图一:



图二:





package cn.huang.my_txtreader; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.io.UnsupportedEncodingException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.text.DecimalFormat; import java.util.Vector; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; public class BookPageFactory { //把字体绘制到界面上 private File book_file = null; private MappedByteBuffer m_mbBuf = null;//MappedByteBuffer 将文件直接映射到内存 private int m_mbBufLen = 0; private int m_mbBufBegin = 0; private int m_mbBufEnd = 0; private String m_strCharsetName = "gbk";//文本格式 private Bitmap m_book_bg = null;//文本图像 private int mWidth; private int mHeight; private Vector<String> m_lines = new Vector<String>(); //用于一行一行显示 private int m_fontSize = 24; private int m_textColor = Color.BLACK;//字体颜色 private int m_backColor = 0xffff9e85; // 背景颜色 private int marginWidth = 15; // 左右与边缘的距离 private int marginHeight = 20; // 上下与边缘的距离 private int mLineCount; // 每页可以显示的行数 private float mVisibleHeight; // 绘制内容的宽 private float mVisibleWidth; // 绘制内容的宽 private boolean m_isfirstPage,m_islastPage; // private int m_nLineSpaceing = 5; private Paint mPaint; //设置阅读界面,包括字体,显示多少行 public BookPageFactory(int w, int h) { // TODO Auto-generated constructor stub mWidth = w; mHeight = h;//获得宽和高 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextAlign(Align.LEFT);//设置文本对齐方式 mPaint.setTextSize(m_fontSize);//设置字体大小 mPaint.setColor(m_textColor);//设置颜色 mVisibleWidth = mWidth - marginWidth * 2; mVisibleHeight = mHeight - marginHeight * 2;//绘制的内容宽和高 mLineCount = (int) (mVisibleHeight / m_fontSize); // 可显示的行数 } //获得文件,并映射到内存 public void openbook(String strFilePath) throws IOException { book_file = new File(strFilePath); long lLen = book_file.length();//文本长度 m_mbBufLen = (int) lLen;//缓存的长度 m_mbBuf = new RandomAccessFile(book_file, "r").getChannel().map( FileChannel.MapMode.READ_ONLY, 0, lLen); //RandomAccessFile是用来访问那些保存数据记录的文件的 } //读一段 protected byte[] readParagraphBack(int nFromPos) { int nEnd = nFromPos;//字符缓存开始的位置 int i; byte b0, b1; if (m_strCharsetName.equals("UTF-16LE")) { i = nEnd - 2;//? while (i > 0) { b0 = m_mbBuf.get(i); b1 = m_mbBuf.get(i + 1); if (b0 == 0x0a && b1 == 0x00 && i != nEnd - 2) { i += 2; break; } i--; } } else if (m_strCharsetName.equals("UTF-16BE")) { i = nEnd - 2; while (i > 0) { b0 = m_mbBuf.get(i);//返回指定索引 b1 = m_mbBuf.get(i + 1); if (b0 == 0x00 && b1 == 0x0a && i != nEnd - 2) { i += 2; break; }//过段时 i--; } } else { i = nEnd - 1;//? while (i > 0) { b0 = m_mbBuf.get(i); if (b0 == 0x0a && i != nEnd - 1) { i++; break; }//过段时 i--; } } if (i < 0) i = 0; //i是过段的索引位置 int nParaSize = nEnd - i; int j; byte[] buf = new byte[nParaSize]; for (j = 0; j < nParaSize; j++) { buf[j] = m_mbBuf.get(i + j); } return buf; } // 读取上一段落 protected byte[] readParagraphForward(int nFromPos) { int nStart = nFromPos;//字符缓存开始的位置 int i = nStart; byte b0, b1; // 根据编码格式判断换行 if (m_strCharsetName.equals("UTF-16LE")) { while (i < m_mbBufLen - 1) { b0 = m_mbBuf.get(i++); b1 = m_mbBuf.get(i++); if (b0 == 0x0a && b1 == 0x00) { break; } } } else if (m_strCharsetName.equals("UTF-16BE")) { while (i < m_mbBufLen - 1) { b0 = m_mbBuf.get(i++); b1 = m_mbBuf.get(i++); if (b0 == 0x00 && b1 == 0x0a) { break; } } } else { while (i < m_mbBufLen) { b0 = m_mbBuf.get(i++); if (b0 == 0x0a) { break; } } } //这使i在换行的索引位置 int nParaSize = i - nStart; byte[] buf = new byte[nParaSize]; for (i = 0; i < nParaSize; i++) { buf[i] = m_mbBuf.get(nFromPos + i); }//把读到的段输入字节流中 return buf; } protected Vector<String> pageDown() { String strParagraph = ""; Vector<String> lines = new Vector<String>(); while (lines.size() < mLineCount && m_mbBufEnd < m_mbBufLen) { //不能大于给定的最多行数 byte[] paraBuf = readParagraphForward(m_mbBufEnd); // 读取一个段落 m_mbBufEnd += paraBuf.length; //减去读到的长度,作为下一个结束的地步 try { strParagraph = new String(paraBuf, m_strCharsetName); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } String strReturn = ""; if (strParagraph.indexOf("\r\n") != -1) { //"\r\n"在字符串中则,下同 strReturn = "\r\n"; strParagraph = strParagraph.replaceAll("\r\n", ""); } else if (strParagraph.indexOf("\n") != -1) { strReturn = "\n"; strParagraph = strParagraph.replaceAll("\n", ""); } if (strParagraph.length() == 0) { lines.add(strParagraph); } while (strParagraph.length() > 0) { int nSize = mPaint.breakText(strParagraph, true, mVisibleWidth, null); //返回刚好要超过规定长度mVisibleWidth的值 lines.add(strParagraph.substring(0, nSize)); strParagraph = strParagraph.substring(nSize); if (lines.size() >= mLineCount) {//超过规定的行数 break; } } if (strParagraph.length() != 0) { try { m_mbBufEnd -= (strParagraph + strReturn) .getBytes(m_strCharsetName).length; //即返回字符串在GBK、UTF-8和ISO8859-1编码下的byte数组表示 //目的在于把m_mbBufEnd改成指向下一行 } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return lines; } //设置文本显示 //预防文本超过界面规定的范围 protected void pageUp() { if (m_mbBufBegin < 0) m_mbBufBegin = 0; Vector<String> lines = new Vector<String>(); String strParagraph = ""; while (lines.size() < mLineCount && m_mbBufBegin > 0) { //不能大于给定的最多行数 Vector<String> paraLines = new Vector<String>(); byte[] paraBuf = readParagraphBack(m_mbBufBegin); //读到一段 //从头开始读 m_mbBufBegin -= paraBuf.length; //减去读到的长度,作为下一个开始要读的标志 try { strParagraph = new String(paraBuf, m_strCharsetName); //第一个参数读到的字符串,第二个参数是文本格式 } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } strParagraph = strParagraph.replaceAll("\r\n", ""); //用第二个参数的字符串替换第一个 strParagraph = strParagraph.replaceAll("\n", ""); //替换掉任何过行的记录 if (strParagraph.length() == 0) {//为空,没有字符串时 paraLines.add(strParagraph); } while (strParagraph.length() > 0) { int nSize = mPaint.breakText(strParagraph, true, mVisibleWidth, null); //测量第一个字符串,与第三个参数即宽度相比 paraLines.add(strParagraph.substring(0, nSize)); //获得0到nSize的字符串 strParagraph = strParagraph.substring(nSize); //字符串变成从nSize开始 }//在于把字符串变成不会超过规定长度mVisibleWidth的字符串 lines.addAll(0, paraLines);//加入所有Vector字符串列 } while (lines.size() > mLineCount) {//超过规定行数时 try { m_mbBufBegin += lines.get(0).getBytes(m_strCharsetName).length; //.get()表示返回指定位置的元素 //String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组 //即返回字符串在GBK、UTF-8和ISO8859-1编码下的byte数组表示 //目的在于把m_mbBufBegin改成指向下一行 lines.remove(0); //删除指定位置的元素 } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } m_mbBufEnd = m_mbBufBegin; return; } protected void prePage() throws IOException { if (m_mbBufBegin <= 0) { m_mbBufBegin = 0; m_isfirstPage=true; return; }else m_isfirstPage=false; m_lines.clear(); //删除所有元素 pageUp(); m_lines = pageDown(); //把收集到的文本放到m_lines中 } public void nextPage() throws IOException { if (m_mbBufEnd >= m_mbBufLen) { m_islastPage=true; return; }else m_islastPage=false; m_lines.clear(); m_mbBufBegin = m_mbBufEnd; m_lines = pageDown(); } public void onDraw(Canvas c) { if (m_lines.size() == 0) m_lines = pageDown(); //现在m_lines的格式是按照 //界面阅读规定的,即有多宽的,有多行 if (m_lines.size() > 0) { if (m_book_bg == null) c.drawColor(m_backColor);//设置背景颜色 else c.drawBitmap(m_book_bg, 0, 0, null); int y = marginHeight; for (String strLine : m_lines) { y += m_fontSize; c.drawText(strLine, marginWidth, y, mPaint); //给界面的每一行绘制 } } float fPercent = (float) (m_mbBufBegin * 1.0 / m_mbBufLen); DecimalFormat df = new DecimalFormat("#0.0");//用于格式化十进制数字 //即按照参数的格式输出 String strPercent = df.format(fPercent * 100) + "%"; int nPercentWidth = (int) mPaint.measureText("999.9%") + 1; //返回字符串的宽度 c.drawText(strPercent, mWidth - nPercentWidth, mHeight - 5, mPaint); } //绘制图像 public void setBgBitmap(Bitmap BG) { m_book_bg = BG; } //返回第一页 public boolean isfirstPage() { return m_isfirstPage; } //返回最后一页 public boolean islastPage() { return m_islastPage; } }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值