1 package swt_jface.demo11;
2 import java.io.File;
3 import java.io.FileInputStream;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.lang.reflect.InvocationTargetException;
7 import org.eclipse.core.runtime.IProgressMonitor;
8 import org.eclipse.jface.action.Action;
9 import org.eclipse.jface.action.MenuManager;
10 import org.eclipse.jface.action.StatusLineManager;
11 import org.eclipse.jface.action.ToolBarManager;
12 import org.eclipse.jface.operation.IRunnableWithProgress;
13 import org.eclipse.jface.resource.ImageDescriptor;
14 import org.eclipse.jface.window.ApplicationWindow;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.Control;
18 import org.eclipse.swt.widgets.FileDialog;
19 import org.eclipse.swt.widgets.Shell;
20 import org.eclipse.swt.widgets.Text;
21 public class FileViewer extends ApplicationWindow {
22 Text text;
23 String content;
24 String lineDelimiter;
25
26 IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
27 public void run(IProgressMonitor monitor)
28 throws InvocationTargetException, InterruptedException {
29 System.out.println("Running from thread: " + Thread.currentThread().getName());
30 getShell().getDisplay().syncExec(new Runnable() {
31 public void run() {
32 content = text.getText();
33 lineDelimiter = text.getLineDelimiter();
34 }
35 });
36 monitor.beginTask("Counting total number of lines", content.length());
37 int lines = 1;
38 for(int i=0; i<content.length(); i++) {
39 if(monitor.isCanceled()) {
40 monitor.done();
41 System.out.println("Action cancelled");
42 return;
43 }
44 if(i + lineDelimiter.length() < content.length()) {
45 if(lineDelimiter.equals(content.substring(i, i+lineDelimiter.length()))) {
46 lines ++;
47 }
48 }
49 monitor.worked(1);
50 Thread.sleep(1);
51 }
52 monitor.done();
53 System.out.println("Total number of lines: " + lines);
54 }
55 };
56
57 Action actionCount = new Action("Count", ImageDescriptor.createFromFile(null, "C:/icons/run.gif")) {
58 public void run() {
59 try {
60 FileViewer.this.run(true, true, runnableWithProgress);
61 } catch (InvocationTargetException e) {
62 e.printStackTrace();
63 } catch (InterruptedException e) {
64 e.printStackTrace();
65 }
66 }
67 };
68 public FileViewer(Shell parentShell) {
69 super(parentShell);
70 addMenuBar();
71 addStatusLine();
72 addToolBar(SWT.FLAT);
73 }
74 protected Control createContents(Composite parent) {
75 getShell().setText("FileViewer v2.0");
76 setStatus("Ready");
77
78 text = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
79 text.setSize(300, 200);
80 return text;
81 }
82
83 Action actionOpenFile = new Action("Open", ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) {
84 public void run() {
85 FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
86 final String file = dialog.open();
87 if(file != null) {
88 try {
89 String content = readFileAsAString(new File(file));
90 text.setText(content);
91 setStatus("File loaded successfully: " + file);
92 } catch (IOException e) {
93 e.printStackTrace();
94 setStatus("Failed to load file: " + file);
95 }
96 }
97 }
98 };
99 protected MenuManager createMenuManager() {
100 MenuManager menuManager = new MenuManager("");
101
102 MenuManager fileMenuManager = new MenuManager("&File");
103 fileMenuManager.add(actionOpenFile);
104
105 menuManager.add(fileMenuManager);
106
107 MenuManager toolsMenuManager = new MenuManager("&Tools");
108 toolsMenuManager.add(actionCount);
109 menuManager.add(toolsMenuManager);
110
111 return menuManager;
112 }
113 protected StatusLineManager createStatusLineManager() {
114 return super.createStatusLineManager();
115 }
116 protected ToolBarManager createToolBarManager(int style) {
117 ToolBarManager toolBarManager = new ToolBarManager(style);
118 toolBarManager.add(actionOpenFile);
119 toolBarManager.add(actionCount);
120 return toolBarManager;
121 }
122 public static void main(String[] args) {
123 ApplicationWindow viewer = new FileViewer(null);
124 viewer.setBlockOnOpen(true);
125 viewer.open();
126 }
127 public static String readFileAsAString(File file) throws IOException {
128 return new String(getBytesFromFile(file));
129 }
130 public static byte[] getBytesFromFile(File file) throws IOException {
131 InputStream is = new FileInputStream(file);
132 long length = file.length();
133 if (length > Integer.MAX_VALUE) {
134 throw new IllegalArgumentException("File is too large! (larger or equal to 2G)");
135 }
136 byte[] bytes = new byte[(int) length];
137 int offset = 0;
138 int numRead = 0;
139 while (offset < bytes.length
140 && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
141 offset += numRead;
142 }
143 if (offset < bytes.length) {
144 throw new IOException(
145 "Could not completely read file " + file.getName());
146 }
147 is.close();
148 return bytes;
149 }
150 }

SWT JFace 小制作 文本阅读器的更多相关文章

  1. 使用 Vue 和 epub.js 制作电子书阅读器

    ePub 简介 ePub 是一种电子书的标准格式,平时我看的电子书大部分是这种格式.在手机上我一般用"多看"阅读 ePub 电子书,在 Windows 上找不到用起来比较顺心的软件 ...

  2. 文本转语音TTS(文本阅读和视频配音制作)MP3

    DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...

  3. Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

    本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个 ...

  4. C#版简易RSS阅读器

    C#版简易RSS阅读器.由VB版修改完成,感谢aowind的技术支持! 源代码: using System; using System.Drawing; using System.Collection ...

  5. 微信小程序(5)--阅读器

    最近用微信小程序写了一个图书阅读器,可以实现左右滑动翻页,按钮翻页,上下滚动,切换背景,控制字体大小.以及记住设置好的状态,如页面再次进来保留上次的背景色和字体大小. 由于暂时没有真实的数据接口,所以 ...

  6. 开发微信小程序——古龙小说阅读器

    概述 由于面试的关系接触了一下微信小程序,花了2晚上开发了一个带书签功能的古龙小说阅读器,并且已经提交审核等待发布.这篇博文记录了我的开发过程和对微信小程序的看法,供以后开发时参考,相信对其他人也有用 ...

  7. android rss阅读器开发一点小技巧

    这几天一直在学习开发Rss阅读器,遇到一个很坑的问题,InputSource这里总是出错.弄了好久,终于让我找到一个解决方法----看代码: new Thread(){ @Override publi ...

  8. 简介SWT Jface

    可以使用标准窗口小部件工具箱(Standard Widget Toolkit,SWT)和 JFace 库来开发用于 Eclipse 环境的图形用户界面,而且还可以将它们用于开发单独的 GUI 本机应用 ...

  9. Linux版EPUB阅读器

    Linux版EPUB阅读器 如果说用平板电脑看书尚属主流的话,那么在电脑上读书就非常少见了.专注阅读16世纪的书是非常困难的了,没人希望后台蹦出QQ聊天窗口.但是如果你非要在电脑上打开电子书的话,那么 ...

随机推荐

  1. vue拼图动画Demo

    这是一个基于vue的Demo,可以实现拼图动画,但是具体的没有写拼图成功的逻辑,鼠标悬停移动.周期刷新 我把它放到的我的博客园界面上了.刷新界面可以看到. 演示地址 :https://liruilon ...

  2. python之线程池和进程池

    线程池和进程池 一.池的概念 池是用来保证计算机硬件安全的情况下最大限度的利用计算机 它降低了程序的运行效率但是保证了计算机硬件的安全从而让你写的程序能够正常运行 ''' 无论是开设进程也好还是开设线 ...

  3. Oracle体系结构概述与SQL解析剖析

    Oracle服务器 是一个数据库管理系统,它提供了一种全面.开放.集成的方法来管理信息. Oracle服务器由Oracle数据库和Oracle实例组成. oracle数据库软件和Oracle数据库软件 ...

  4. antd pro table中的文件上传

    概述 示例代码 列表页面 form 页面 model.js service.js 总结 概述 项目中经常会遇到在表格中展示图片的需求(比如展示用户信息时, 有一列是用户的头像). antd pro t ...

  5. 彻底根治window弹窗小广告(今日热点)

    在一个阴雨蒙蒙的下午,我上完厕所回到工位,输入锁屏密码,解锁,蹦出来三个小广告,我......这还能忍??? 废话不多说,开搞! 一.广告分为两种: 红色字的今日热点 蓝色字的今日热点 二.追溯根源: ...

  6. java9系列第二篇-资源自动关闭的语法增强

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  7. 如何修改或新增visual studio 的模板

    在 visual studio 中添加模板,我这里是新增mvc.net的模板 vs2017在文件夹=>(举例说明,请替换为相应的安装目录) D:\Program Files (x86)\Micr ...

  8. 还不会ida*算法?看完这篇或许能理解点。

    IDA* 算法分析 IDA* 本质上就是带有估价函数和迭代加深优化的dfs与,A * 相似A *的本质便是带 有估价函数的bfs,估价函数是什么呢?估价函数顾名思义,就是估计由目前状态达 到目标状态的 ...

  9. HCIA——应用层常用协议

    DNS协议 1.什么是DNS协议呢? DNS协议简单来说就是为IP取一个别名的系统(叫域名如www.baidu.com),最终目的是便于我们记忆. 一个域名可能有多个IP,同样一个IP可能也会有多个域 ...

  10. 什么是C和C++标准——小白必看

    本文简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的. 我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁发明了 ...