eclipse-向Console控制台输出信息

首先这里主要用到的是org.eclipse.ui.console这个包,所以现在顺道先来了解一下:

org.eclipse.ui.console是一个可扩展的console视图插件,利用它可以实现各种console,并把它们显示出来。该插件本身就实现了一个Message Console,对于只需要进行消息输出的RCP应用来说,其功能已经足够:

  • 调用ConsolePlugin.getDefault().getConsoleManager()得到一个IConsoleManager引用
  • 创建所需的MessageConsole,并把它(们)加入到上一步得到的Console Manager里
  • 调用MessageConsole.newMessageStream()得到连接这个Console的输出流(MessageConsoleStream)
  • 通过MessageConsoleStream的print,println方法进行消息的输出。当然需要把Console View打开才能看到输出,可以利用Window/Show View来打开,或者把该View在放到自己实现的Perspective的初始布局中

下面简要列举其设计及实现要点:

  • 作为一个通用的console及其显示的框架,org.eclipse.ui.console定义了以下几个接口:
    • IConsole. 代表一个Console,主要方法是createPage,用来创建该Console在Console View中的分页
    • IConsole Manager. 代表一个Console Manager,对Console进行管理
    • IConsoleListener. 代表一个Console Listener,当Console被加进Console Manager中或从中删除时会得到通知
    • IConsoleView. 代表Console View,用来显示各个Console
  • org.eclipse.ui.console 本身实现了一个Console View,通过在org.eclipse.ui.views扩展点上扩展的方式。该实现已经相当一般化,一般情况下是不需要实现自己的Console View的.它的实现类是ConsoleView,是一个 PageBookView,每个Console以一个Page的方式呈现,效果就是我们在eclipse里看到的那个Console标签页。
  • Console 和PageBookView Page的关系。简言之,就是MVC中Model和View的关系,Model是Console,Page负责把它显示出来。对于TextConsole 和TextConsolePage,这种Model-View关系是通过TextConsole和(TextConsolePage所关联的)TextConsoleViewer之间的 Model-View关系来实现的,如图所示。再看TextConsole和TextConsoleViewer的Model-View关系的实现:TextConsole关联一个 ConsoleDocument,实现了IDoucment接口,而 TextConsoleViewer是一个TextViewer,在其构造函数中设置其Document为TextConsole关联的 Document(ConsoleDocument),由此可以看出,TextConsole和TextConsolePage之间的Model-View关系最终还是由jface text框架的IDocument和TextViewer之间的Model-View 关系来实现的。Console和其Page的关系是通过IConsole的createPage方法来建立的,比如,TextConsole的 createPage创建的TextConsolePage对象保存了相应TextConsole对象的引用;对于MessageConsole来说,由于它没有覆盖IOConsole的createPage方法,因此创建的是一个IOConsolePage对象, 该IOConsolePage对象保存的虽然是一个TextConsole引用,但其实际类型是MessageConsole。
  • 当向第1步得到的Console Manager里加Console时,如果此时ConsoleView已经实例化,则它会是该Console Manager 的一个Console Listener,因此会受到consolesAdded的事件通知,ConsoleView对此事件的处理是调用相应 Console的createPage方法创建一个IPageBookViewPage并显示它。如果ConsoleView是以后实例化的,则它实例化时会从Console Manager取到当前在Console Manager中的所有Console,对每个Console创建一个 IPageBookViewPage。
  • MessgaeConsole是一个IOConsole,IOConsole用于显示I/O流里的Text;而IOConsole又是一个TextConsole,TextConsole是一个抽象的文本Console,支持正则表达式匹配和超级链接,它包含一个Document,概念上就是 jface text框架中的文档概念,其实现类是ConsoleDocument。MessageConsole.createPage返回的实际上是一个 IOConsolePage,其createControl方法的实现创建了一个IOConsoleViewer,该viewer是jface text框架的TextViewer,其Document被设置为这个MessageConsole的Document,因此当MessageConsole的 Document改变时, 其Page上的TextViewer将反映该变化。
  • IOConsole关联一个Doucment Partitioner(IConsoleDocumentPartitioner),该接口扩展自jface text框架中的 IDocumentPartitioner,其实现类是IOConsolePartitioner.当通过MessageConsoleStream往 MessageConsole上输出消息时,消息实际进入了这个IOConsolePartitioner内部保存的一个消息列表里。IOConsolePartitioner里实现了一个Job Scheduling,其效果就是不断检查该消息列表,把其中的消息添加到MessageConsole的Document的末尾,当然这个工作是在另外的 线程中作的。此时如果ConsoleView已实例化,则该MessageConsole会和其Page上IOConsoleViewer相关联,因此消息便能在该Console的Page中显示出来了。

添加依赖:

	MessageConsole console = null;
    MessageConsoleStream consoleStream = null;
    IConsoleManager consoleManager = null;
    final String CONSOLE_NAME = "naonConsole";

    private void initConsole() {
		consoleManager = ConsolePlugin.getDefault().getConsoleManager();
		IConsole[] consoles = consoleManager.getConsoles();

		if (consoles.length > 0) {
			System.out.println("consoles.length > 0");
			console = (MessageConsole) consoles[0];
		} else{
			System.out.println("consoles.length = 0,new MessageConsole");
			console = new MessageConsole(CONSOLE_NAME, null);
			consoleManager.addConsoles(new IConsole[] { console });
		}
		consoleStream = console.newMessageStream();
  }
    
    /**
     * 开启console, 打印相关消息
     * @param message 消息内容
     */
    public void printMessage(String message) {
        if (message != null) {
            if (console == null) {
                initConsole();
            }
            // 显示Console视图
            consoleManager.showConsoleView(console);
            // 打印消息
            consoleStream.print(message + "\n");
		    
        }
    }
带颜色的:
 private void initConsole() {
		consoleManager = ConsolePlugin.getDefault().getConsoleManager();
		IConsole[] consoles = consoleManager.getConsoles();

		if (consoles.length > 0) {
			System.out.println("consoles.length > 0");
			console = (MessageConsole) consoles[0];
		} else{
			System.out.println("consoles.length = 0,new MessageConsole");
			console = new MessageConsole(CONSOLE_NAME, null);
			consoleManager.addConsoles(new IConsole[] { console });
		}
		consoleStream = console.newMessageStream();
		Display display = Display.getCurrent();  
		consoleStream.setColor(display.getSystemColor(SWT.COLOR_RED)); 
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI之下 360让PC商业生态大象起舞

时隔7年,淘宝PC版在前不久迎来重磅升级,在产品体验、商品供给、内容供给等方面做了全面优化,以全面提升PC端的用户体验;当大家都以为移动互联网时代下APP将成为主流时,PC端却又成为了香饽饽。其实PC端被重视&#xff0…

【Linux】操作系统中的文件系统管理:磁盘结构、逻辑存储与文件访问机制

文章目录 前言:1. 磁盘机械结构2. 磁盘物理结构3. 磁盘的逻辑存储3. 1. 文件名呢?3.2 对文件的增删查改与 路径3.3. 文件 4. 软硬链接4.1. 操作观察现象4.2. 软硬链接的原理4.3. 软硬链接的应用场景 总结 前言: 在现代操作系统中&#xff0c…

mysql的锁(全局锁)

文章目录 mysql按照锁的粒度分类全局锁概念:全局锁使用场景:全局锁备份案例: mysql按照锁的粒度分类 全局锁 概念: 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是: Flush tables with…

多输入多输出非线性对象的模型预测控制—Matlab实现

本示例展示了如何在 Simulink 中设计多输入多输出对象的闭环模型预测控制。该对象有三个操纵变量和两个测量输出。 一、非线性对象的线性化 运行该示例需要同时安装 Simulink 和 Simulink Control Design。 % 检查是否同时安装了 Simulink 和 Simulink Control Design if ~m…

网络网络层之(6)ICMPv4协议

网络网络层之(6)ICMPv4协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

山东军博会—2024年智能装备和通信技术展:见证类脑视觉芯片如何重塑未来

随着人工智能技术的飞速发展,类脑计算成为了科研领域的一个热点。最近,我国科学家成功研发出世界首款类脑互补视觉芯片,这一重大突破不仅标志着我国在人工智能硬件领域迈出了重要一步,也为未来的智能设备带来了无限可能。本文将从…

玄机科技再度引领国漫风潮,携手百度文库共创AI动漫新纪元

在5月30日举办的百度移动生态万象大会上,国内知名动画制作及运营企业玄机科技受邀出席,并与百度文库达成重要战略合作,共同探索AI技术在动漫领域的应用,开启智能动漫解决方案的新篇章。此次合作不仅展现了玄机科技在动画制作领域的…

攻防世界maze做法(迷宫题)

首先查壳64bit,直接丢进ida64中进行反编译就完事儿了,然后直接进入main函数打注释分析首先,题目已经提示了这是个迷宫题,我们抓住做迷宫题的两个要点,一找玩法,二找地图, 玩法在主函数中&#…

【代码随想录】【算法训练营】【第27天】 [39]组合总和 [40] 组合总和II [131]分割回文串

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day26, 休息的周末~ day 27,周一,库存没了,哭死~ 题目详情 [39] 组合总和 题目描述 39 组合总和 解题思路 前提:组合的子集问题&…

上位机图像处理和嵌入式模块部署(f103 mcu获取唯一id)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于stm32f103系列mcu来说,一般每一颗原厂的mcu,都会对应一个唯一的id。那这个id可以用来做什么用呢?个人认为&…

【电子通识】什么是电力电子

什么是电力电子 在日常生活中,电能变换的需求无处不在。比如给手机充电,充电器从插座220V交流电取电并转换为手机电池所需的5V或者其他幅度的直流电输送给手机,这就完成了最简单的AC-DC电能转换。除此之外,还有空调、电视、新能源…

LLM主流开源代表模型

LLM主流开源大模型介绍 1 LLM主流大模型类别 随着ChatGPT迅速火爆,引发了大模型的时代变革,国内外各大公司也快速跟进生成式AI市场,近百款大模型发布及应用。 目前,市面上已经开源了各种类型的大语言模型,本章节我们…

【数据结构】详解堆的基本结构及其实现

文章目录 前言1.堆的相关概念1.1堆的概念1.2堆的分类1.2.1小根堆1.2.2大根堆 1.3堆的特点堆的实用场景 2.堆的实现2.1初始化2.2插入2.3堆的向上调整2.4删除2.5堆的向下调整2.6判空2.7获取堆顶元素2.8销毁 3.堆排序3.1实现3.2堆排序的时间复杂度问题 前言 在上一篇文章中&#…

大模型时代的具身智能系列专题(七)

北大王鹤团队 王鹤,北京大学前沿计算研究中心助理教授,本科毕业于清华大学,博士毕业于斯坦福大学,师从美国三院院士Leonidas. J Guibas教授。他创立并领导了具身感知与交互实验室(EPIC Lab),实验室立足三维视觉感知与…

怎么控制员工电脑的文件外发,六个控制文件外发的小窍门你必须了解

控制员工电脑的文件外发是企业信息安全管理中的重要环节,旨在防止敏感数据泄露、保护知识产权和维护商业秘密。 企业可以通过多种技术和管理措施相结合的方式来达到这一目的,确保既有效控制文件外发风险,又不影响正常的业务运作和员工工作效…

Java设计模式——建造者模式

目录 前言 一、什么是建造者模式 二、建造者模式的核心角色 三、建造者模式的优点 四、具体实现 1、抽象建造者类 2、具体建造者类 3、产品类 4、指挥者类 5、客户端代码 总结 前言 在软件工程中,我们经常遇到需要创建复杂对象的情况。这些对象可能由多个…

MongoDB CRUD操作:地理位置查询中的GeoJSON对象

MongoDB CRUD操作:地理位置查询中的GeoJSON对象 文章目录 MongoDB CRUD操作:地理位置查询中的GeoJSON对象Point类型LineString类型Polygon(多边形)类型单环多边形多环多边形 MultiPoint类型MultiLineString类型MultiPolygon类型Ge…

[FreeRTOS 基础知识] 堆

文章目录 堆的概念使用C语言实现 堆堆空间解析 堆的概念 所谓的堆就是一块空间的内存,可以来管理这块内存。从这块内存中取出一部分然后再释放回去。 使用C语言实现 堆 char heap_buf[1024]; // 定义一个堆空间 int pos0; // 当前…

牛客网刷题 | BC116 [NOIP2013]记数问题

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 试计算在区间1 到n…

C++的vector使用优化

我们在上一章说了如何使用这个vector动态数组,这章我们说说如何更好的使用它以及它是如何工作的。当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置&#xff0c…